version 1.1, 2003/02/28 21:34:05
|
version 1.1.2.1, 2003/02/28 21:34:05
|
|
|
|
<!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$<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">"ProviderManagerService:: handleEnableIndicationsRequest"</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"><</font><font color="#2040a0">CIMEnableIndicationsRequestMessage</font> <font color="4444FF">*</font><font color="4444FF">></font><font color="4444FF">(</font> |
|
<a name="1_line8" href="#1_line8"> 8</a> <font color="#2040a0">const_cast</font><font color="4444FF"><</font><font color="#2040a0">Message</font> <font color="4444FF">*</font><font color="4444FF">></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"><</font><font color="#2040a0">AsyncRequest</font> <font color="4444FF">*</font><font color="4444FF">></font><font color="4444FF">(</font><font color="#2040a0">op</font><font color="4444FF">-</font><font color="4444FF">></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">&</font><font color="4444FF">&</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">></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">></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">></font><font color="#2040a0">setKey</font><font color="4444FF">(</font><font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">></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">></font><font color="#2040a0">dest</font> <font color="4444FF">=</font> <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">></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"><</font><font color="#2040a0">String</font>, <font color="#2040a0">String</font>, <font color="#2040a0">String</font><font color="4444FF">></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">></font><font color="#2040a0">provider</font>, <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">></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">"Calling provider.enableIndications: "</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">"Storing indication handler for "</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">&</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">"Exception: "</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">></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">&</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">"Exception: "</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">></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">"Internal Error"</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">"Exception: Unknown"</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">></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">"Unknown Error"</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">></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">></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">"ProviderManagerService::handleDisableIndicationsRequest"</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"><</font><font color="#2040a0">CIMDisableIndicationsRequestMessage</font> <font color="4444FF">*</font><font color="4444FF">></font><font color="4444FF">(</font> |
|
<a name="1_line97" href="#1_line97"> 97</a> <font color="#2040a0">const_cast</font><font color="4444FF"><</font><font color="#2040a0">Message</font> <font color="4444FF">*</font><font color="4444FF">></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"><</font><font color="#2040a0">AsyncRequest</font> <font color="4444FF">*</font><font color="4444FF">></font><font color="4444FF">(</font><font color="#2040a0">op</font><font color="4444FF">-</font><font color="4444FF">></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">&</font><font color="4444FF">&</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">></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">></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">></font><font color="#2040a0">setKey</font><font color="4444FF">(</font><font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">></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"><</font><font color="#2040a0">CIMIndication</font><font color="4444FF">></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"><</font><font color="#2040a0">String</font>, <font color="#2040a0">String</font>, <font color="#2040a0">String</font><font color="4444FF">></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">></font><font color="#2040a0">provider</font>, <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">></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">"Calling provider.disableIndications: "</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">"Removing and Destroying indication handler for "</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">&</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">"Exception: "</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">></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">&</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">"Exception: "</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">></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">"Internal Error"</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">"Exception: Unknown"</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">></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">"Unknown Error"</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">></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">></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"><</font><font color="#2040a0">CIMIndication</font><font color="4444FF">></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"><</font><font color="#2040a0">CIMIndication</font><font color="4444FF">></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"><</font><font color="#2040a0">Uint32</font><font color="4444FF">></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">></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">&</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"><</font><font color="#2040a0">MessageQueueService</font> <font color="4444FF">*</font><font color="4444FF">></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">&</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">&</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">&</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">></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">></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">// <<< Wed Apr 10 21:04:00 2002 mdd >>></font> |
|
<a name="2_line60" href="#2_line60"> 60</a> <font color="#444444">// AsyncOpNode * op = _source->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">></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">></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">></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->SendWait(asyncRequest);</font> |
|
<a name="2_line73" href="#2_line73"> 73</a> <font color="#444444">// <<< Wed Apr 10 21:04:50 2002 mdd >>></font> |
|
<a name="2_line74" href="#2_line74"> 74</a> <font color="#2040a0">_source</font><font color="4444FF">-</font><font color="4444FF">></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">// <<< Wed Apr 10 21:05:10 2002 mdd >>></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"><</font><font color="#2040a0">CIMIndication</font><font color="4444FF">></font> <font color="4444FF">&</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">&</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"><</font><font color="#2040a0">CIMIndication</font><font color="4444FF">></font> <font color="4444FF">&</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"><</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">&</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">&</font> <font color="#2040a0">association</font>, |
|
<a name="3_line10" href="#3_line10"> 10</a> <font color="#2040a0">CIMObjectPath</font> <font color="4444FF">&</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"><</font><font color="#2040a0">String</font><font color="4444FF">></font> <font color="4444FF">&</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">"eServerIndicationService::__getNameSpaceNames"</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">></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">></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">&</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">></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">></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">&</font> <font color="#2040a0">indication</font>, |
|
<a name="3_line65" href="#3_line65"> 65</a> <font color="#2040a0">Array</font><font color="4444FF"><</font><font color="#2040a0">CIMInstance</font><font color="4444FF">></font> <font color="4444FF">&</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"><</font><font color="#2040a0">String</font><font color="4444FF">></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"><</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">&</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">&</font> <font color="#2040a0">indication</font>, |
|
<a name="3_line86" href="#3_line86"> 86</a> <font color="#2040a0">Array</font><font color="4444FF"><</font><font color="#2040a0">CIMInstance</font><font color="4444FF">></font> <font color="4444FF">&</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"><</font><font color="#2040a0">CIMInstance</font><font color="4444FF">></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"><</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">"Indication_Class"</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">&</font> <font color="#2040a0">nameSpaceName</font>, |
|
<a name="3_line118" href="#3_line118">118</a> <font color="#2040a0">Array</font> <font color="4444FF"><</font><font color="#2040a0">CIMInstance</font><font color="4444FF">></font> <font color="4444FF">&</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">"eServerIndicationService::_getSubscriptions"</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">></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">></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">></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">></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"><</font><strong>class</strong> <font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">></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"><</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">></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">></font> <strong>this</strong><font color="4444FF">-</font><font color="4444FF">></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">></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">></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"><</font><font color="#2040a0">ArrayRep</font><font color="4444FF"><</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">></font><font color="4444FF">*</font><font color="4444FF">></font><font color="4444FF">(</font><font color="#2040a0">_rep</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> <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"><</font><strong>class</strong> <font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">></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"><</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">></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"><</font><strong>class</strong> <font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">></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"><</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">></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">></font> <strong>this</strong><font color="4444FF">-</font><font color="4444FF">></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">></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"><</font><font color="#2040a0">ArrayRep</font><font color="4444FF"><</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">></font><font color="4444FF">*</font><font color="4444FF">></font><font color="4444FF">(</font><font color="#2040a0">_rep</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> <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">></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">"Creating Provider Module "</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">></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">></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">></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">"Using Cached Provider Module "</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">></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">"Loading/Linking Provider Module "</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">></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">></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">></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"><</font><font color="#2040a0">MessageQueueService</font> <font color="4444FF">*</font><font color="4444FF">></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">></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">></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">"Loading Provider "</font> <font color="4444FF">+</font> <font color="#2040a0">pr</font><font color="4444FF">-</font><font color="4444FF">></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"><</font><font color="4444FF"><</font> <font color="#008000">"Loading Provider "</font> <font color="4444FF"><</font><font color="4444FF"><</font> |
|
<a name="5_line41" href="#5_line41">41</a> <font color="#2040a0">pr</font><font color="4444FF">-</font><font color="4444FF">></font><font color="#2040a0">_name</font> <font color="4444FF"><</font><font color="4444FF"><</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">></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">></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">&</font><font color="4444FF">(</font><font color="#2040a0">pr</font><font color="4444FF">-</font><font color="4444FF">></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">></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 "Software"), 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">// "AS IS", 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"><Pegasus/Common/Config.h></font></strong></font> |
|
<a name="6_line34" href="#6_line34">34</a> <font color="0000ff"><strong>#include <font color="#008000"><Pegasus/Provider/CIMBaseProvider.h></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"><Pegasus/Common/CIMInstance.h></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">&</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">&</font> <font color="#2040a0">indication</font>, |
|
<a name="6_line65" href="#6_line65">65</a> <font color="#2040a0">ResponseHandler</font><font color="4444FF"><</font><strong>void</strong><font color="4444FF">></font> <font color="4444FF">&</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">&</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">&</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">&</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">"en_US"</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">"2.0.0."</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">"Derived from PG_ProviderModule "</font> |
|
<a name="7_line26" href="#7_line26"> 26</a> <font color="#008000">"modified to support additional provider types and additional "</font> |
|
<a name="7_line27" href="#7_line27"> 27</a> <font color="#008000">"provider qualifications. "</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">"Name"</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">"A human-readable name that uniquely "</font> |
|
<a name="7_line30" href="#7_line30"> 30</a> <font color="#008000">"identifies the Provider Module, inherited from PG_ProviderModule."</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">"Location"</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">"The file path to the module. "</font> |
|
<a name="7_line34" href="#7_line34"> 34</a> <font color="#008000">" If the usURL qualifier is present, indicates that the "</font> |
|
<a name="7_line35" href="#7_line35"> 35</a> <font color="#008000">"path is a URL. Otherwise the path is a string that represents "</font> |
|
<a name="7_line36" href="#7_line36"> 36</a> <font color="#008000">" the location of the module in the local host's file system."</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">"InterfaceType"</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font> <font color="4444FF">(</font><font color="#008000">"The interface definition "</font> |
|
<a name="7_line40" href="#7_line40"> 40</a> <font color="#008000">"supported by this module. Implies both a method signature and "</font> |
|
<a name="7_line41" href="#7_line41"> 41</a> <font color="#008000">" a binary specification for linking to the module and executing its code. "</font> |
|
<a name="7_line42" href="#7_line42"> 42</a> <font color="#008000">"In Pegasus 2.01 the InterfaceType also implies a specific "</font> |
|
<a name="7_line43" href="#7_line43"> 43</a> <font color="#008000">"ProviderManagerService, although this link will be broken in the "</font> |
|
<a name="7_line44" href="#7_line44"> 44</a> <font color="#008000">"future. "</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">"C++Default"</font>, <font color="#008000">"CMPI"</font>, <font color="#008000">"Java_Default"</font>, <font color="#008000">"Java_SNIA"</font>, |
|
<a name="7_line46" href="#7_line46"> 46</a> <font color="#008000">"Java_Wbem_Services"</font>, <font color="#008000">"Perl"</font>, <font color="#008000">"Unix_Domain"</font>, |
|
<a name="7_line47" href="#7_line47"> 47</a> <font color="#008000">"Named_Pipe"</font>, <font color="#008000">"WSDL_SOAP"</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">"The host of the computer upon which this module resides. "</font> |
|
<a name="7_line51" href="#7_line51"> 51</a> <font color="#008000">"For local providers this will be <font color="#77dd77">\"</font>localhost<font color="#77dd77">\"</font>. For remote "</font> |
|
<a name="7_line52" href="#7_line52"> 52</a> <font color="#008000">"providers this property should contain the DNS name of the "</font> |
|
<a name="7_line53" href="#7_line53"> 53</a> <font color="#008000">"remote host. "</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">"The PGP Signature of the module's file. "</font> |
|
<a name="7_line57" href="#7_line57"> 57</a> <font color="#008000">"The provider manager or any other module can use this "</font> |
|
<a name="7_line58" href="#7_line58"> 58</a> <font color="#008000">" signature to determine the authenticity if the module "</font> |
|
<a name="7_line59" href="#7_line59"> 59</a> <font color="#008000">" and the integrity of the module's image. "</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">"2.0.0"</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">"eServer_Provider is derived from "</font> |
|
<a name="7_line76" href="#7_line76"> 76</a> <font color="#008000">"PG_Provider. "</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">"The scoping eServer_ProviderModule name. "</font> |
|
<a name="7_line80" href="#7_line80"> 80</a> <font color="#008000">"Inherited as a propagated key from PG_Provider, having "</font> |
|
<a name="7_line81" href="#7_line81"> 81</a> <font color="#008000">"the syntax PG_ProviderModule.name"</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">"Name"</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">"A human-readable name that: |
|
<a name="7_line84" href="#7_line84"> 84</a> "</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">" |
|
<a name="7_line85" href="#7_line85"> 85</a> "</font><font color="#2040a0">Inherited</font> <font color="#2040a0">from</font> <font color="#2040a0">PG_Provider</font>.<font color="#008000">")] |
|
<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> "</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">" |
|
<a name="7_line89" href="#7_line89"> 89</a> "</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">" |
|
<a name="7_line90" href="#7_line90"> 90</a> "</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">" |
|
<a name="7_line91" href="#7_line91"> 91</a> "</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">" |
|
<a name="7_line92" href="#7_line92"> 92</a> "</font><font color="#2040a0">in</font> <font color="#2040a0">more</font> <font color="#2040a0">detail</font>. \<font color="#008000">"Stressed<font color="#77dd77">\"</font> indicates that the element "</font> |
|
<a name="7_line93" href="#7_line93"> 93</a> <font color="#008000">"is functioning, but needs attention. Examples of "</font> |
|
<a name="7_line94" href="#7_line94"> 94</a> <font color="#008000">"<font color="#77dd77">\"</font>Stressed<font color="#77dd77">\"</font> states are overload, overheated, etc. "</font> |
|
<a name="7_line95" href="#7_line95"> 95</a> <font color="#008000">"<font color="#77dd77">\"</font>Predictive Failure<font color="#77dd77">\"</font> indicates that an element is "</font> |
|
<a name="7_line96" href="#7_line96"> 96</a> <font color="#008000">"functioning nominally but predicting a failure in the "</font> |
|
<a name="7_line97" href="#7_line97"> 97</a> <font color="#008000">"near future. <font color="#77dd77">\"</font>In Service<font color="#77dd77">\"</font> describes an element being "</font> |
|
<a name="7_line98" href="#7_line98"> 98</a> <font color="#008000">"configured, maintained, cleaned, or otherwise administered. "</font> |
|
<a name="7_line99" href="#7_line99"> 99</a> <font color="#008000">"<font color="#77dd77">\"</font>No Contact<font color="#77dd77">\"</font> indicates that the monitoring system "</font> |
|
<a name="7_line100" href="#7_line100">100</a> <font color="#008000">"has knowledge of this element, but has never been able to "</font> |
|
<a name="7_line101" href="#7_line101">101</a> <font color="#008000">"establish communications with it. <font color="#77dd77">\"</font>Lost Communication<font color="#77dd77">\"</font> "</font> |
|
<a name="7_line102" href="#7_line102">102</a> <font color="#008000">"indicates that the ManagedSystemElement is known to exist "</font> |
|
<a name="7_line103" href="#7_line103">103</a> <font color="#008000">"and has been contacted successfully in the past, but is "</font> |
|
<a name="7_line104" href="#7_line104">104</a> <font color="#008000">"currently unreachable. <font color="#77dd77">\"</font>Stopped<font color="#77dd77">\"</font> indicates that the "</font> |
|
<a name="7_line105" href="#7_line105">105</a> <font color="#008000">"element is known to exist, is not operational (e.g., it "</font> |
|
<a name="7_line106" href="#7_line106">106</a> <font color="#008000">"is unable to provide service to users), but it has not "</font> |
|
<a name="7_line107" href="#7_line107">107</a> <font color="#008000">"failed. It has purposely been made non-operational. <font color="#77dd77">\n</font>"</font> |
|
<a name="7_line108" href="#7_line108">108</a> <font color="#008000">" OperationalStatus replaces the Status property on "</font> |
|
<a name="7_line109" href="#7_line109">109</a> <font color="#008000">"ManagedSystemElement to provide a consistent approach to "</font> |
|
<a name="7_line110" href="#7_line110">110</a> <font color="#008000">"enumerations, to address implementation needs for an "</font> |
|
<a name="7_line111" href="#7_line111">111</a> <font color="#008000">"array property, and to provide a migration path from today's "</font> |
|
<a name="7_line112" href="#7_line112">112</a> <font color="#008000">"environment to the future. This change was not made earlier "</font> |
|
<a name="7_line113" href="#7_line113">113</a> <font color="#008000">"since it required the DEPRECATED qualifier. Due to the "</font> |
|
<a name="7_line114" href="#7_line114">114</a> <font color="#008000">"widespread use of the existing Status property in "</font> |
|
<a name="7_line115" href="#7_line115">115</a> <font color="#008000">"management applications, it is strongly recommended that "</font> |
|
<a name="7_line116" href="#7_line116">116</a> <font color="#008000">"providers/instrumentation provide BOTH the Status and "</font> |
|
<a name="7_line117" href="#7_line117">117</a> <font color="#008000">"OperationalStatus properties. As always, Status (since it "</font> |
|
<a name="7_line118" href="#7_line118">118</a> <font color="#008000">"is single-valued) provides the primary status of the "</font> |
|
<a name="7_line119" href="#7_line119">119</a> <font color="#008000">"element."</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">"0"</font>, <font color="#008000">"1"</font>, <font color="#008000">"2"</font>, <font color="#008000">"3"</font>, <font color="#008000">"4"</font>, <font color="#008000">"5"</font>, <font color="#008000">"6"</font>, <font color="#008000">"7"</font>, <font color="#008000">"8"</font>, |
|
<a name="7_line121" href="#7_line121">121</a> <font color="#008000">"9"</font>, <font color="#008000">"10"</font>, <font color="#008000">"11"</font>, <font color="#008000">"12"</font>, <font color="#008000">"13"</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">"Unknown"</font>, <font color="#008000">"Other"</font>, <font color="#008000">"OK"</font>, <font color="#008000">"Degraded"</font>, <font color="#008000">"Stressed"</font>, |
|
<a name="7_line123" href="#7_line123">123</a> <font color="#008000">"Predictive Failure"</font>, <font color="#008000">"Error"</font>, <font color="#008000">"Non-Recoverable Error"</font>, |
|
<a name="7_line124" href="#7_line124">124</a> <font color="#008000">"Starting"</font>, <font color="#008000">"Stopping"</font>, <font color="#008000">"Stopped"</font>, <font color="#008000">"In Service"</font>, |
|
<a name="7_line125" href="#7_line125">125</a> <font color="#008000">"No Contact"</font>, <font color="#008000">"Lost Communication"</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">"CIM_ManagedSystemElement.OtherStatusDescription"</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">"A string describing the status - used when the "</font> |
|
<a name="7_line131" href="#7_line131">131</a> <font color="#008000">"OperationalStatus property is set to 1 (<font color="#77dd77">\"</font>Other<font color="#77dd77">\"</font>)."</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">"CIM_ManagedSystemElement.OperationalStatus"</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">"2.0.0"</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">"An instance of ProviderCapabilities "</font> |
|
<a name="7_line146" href="#7_line146">146</a> <font color="#008000">"describes a set of abilities for a specific provider."</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">"The scoping eServer_ProviderModuleName. "</font> |
|
<a name="7_line149" href="#7_line149">149</a> <font color="#008000">"Inherited as a Propagated key from PG_ProviderCapabilities, "</font> |
|
<a name="7_line150" href="#7_line150">150</a> <font color="#008000">"having the syntax PG_Provider.ProviderModuleName"</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">"The scoping eServer_Provider Name."</font> |
|
<a name="7_line153" href="#7_line153">153</a> <font color="#008000">"Inherited as a Propagated key from PG_ProviderCapabilities, "</font> |
|
<a name="7_line154" href="#7_line154">154</a> <font color="#008000">"having the syntax PG_Provider.Name"</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">"A value that uniquely identifies this "</font> |
|
<a name="7_line158" href="#7_line158">158</a> <font color="#008000">" set of abilities for the designated Providers."</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">"ProviderType"</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">"ProviderType enumerates "</font> |
|
<a name="7_line162" href="#7_line162">162</a> <font color="#008000">" the specific method types that the provider supports. "</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">"Indexed"</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">"2"</font>, <font color="#008000">"3"</font>, <font color="#008000">"4"</font>, <font color="#008000">"5"</font>, <font color="#008000">"6"</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">"Instance"</font>, <font color="#008000">"Association"</font>, <font color="#008000">"Indication"</font>, <font color="#008000">"Method"</font>, |
|
<a name="7_line166" href="#7_line166">166</a> <font color="#008000">"Indication_Consumer"</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">&</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">&</font> <font color="#2040a0">className</font>, |
|
<a name="8_line4" href="#8_line4"> 4</a> <font color="#2040a0">CIMInstance</font> <font color="4444FF">&</font> <font color="#2040a0">provider</font>, |
|
<a name="8_line5" href="#8_line5"> 5</a> <font color="#2040a0">CIMInstance</font> <font color="4444FF">&</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">"ProviderRegistrationManager::lookupConsumerProvider"</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">"<font color="#77dd77">\n</font>nameSpace = "</font> <font color="4444FF">+</font> <font color="#2040a0">nameSpace</font> <font color="4444FF">+</font> <font color="#008000">"; className = "</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">"; capabilityKey = "</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">></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"><</font><font color="#2040a0">CIMInstance</font><font color="4444FF">></font> <font color="#2040a0">instances</font> <font color="4444FF">=</font> <font color="#2040a0">providerCapability</font><font color="4444FF">-</font><font color="4444FF">></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">"Missing ProviderName which is key in PG_ProviderCapabilities class."</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">"Missing ProviderModuleName which is key in PG_ProviderCapabilities class."</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">></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"><</font><font color="#2040a0">CIMInstance</font><font color="4444FF">></font> <font color="#2040a0">providerInstances</font> <font color="4444FF">=</font> <font color="#2040a0">_provider</font><font color="4444FF">-</font><font color="4444FF">></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">></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"><</font><font color="#2040a0">CIMInstance</font><font color="4444FF">></font> <font color="#2040a0">providerModuleInstances</font> <font color="4444FF">=</font> <font color="#2040a0">_providerModule</font><font color="4444FF">-</font><font color="4444FF">></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">&</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">"ProcessIndicationProvider"</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">"ProcessIndicationProvider"</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">"Pegasus Community"</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">"2.0.0"</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">"C++Default"</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">"2.0.0"</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">"localhost"</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">"ProcessIndicationProvider"</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">"eServer_ProcessIndicationProvider"</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">"ProcessIndicationProvider"</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">"eServer_ProcessIndicationProvider"</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">"1"</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">"CIM_ProcessIndication"</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">"root/PG_Interop"</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">"ProcessIndicationProvider"</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">"eServer_ProcessIndicationConsumer"</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">"ProcessIndicationProvider"</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">"eServer_ProcessIndicationConsumer"</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">"2"</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">"eServer_ProcessIndicationConsumer"</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">"root/PG_Interop"</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">"CIM_ProcessIndication"</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">"eServer_ProcessIndicationConsumer"</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"><</font><font color="#2040a0">CIMIndication</font><font color="4444FF">></font> <font color="4444FF">&</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"><</font><font color="4444FF"><</font> <font color="#008000">"eServer_ProcessIndicationProvider: enableIndications"</font> <font color="4444FF"><</font><font color="4444FF"><</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">&</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">></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"><</font><font color="4444FF"><</font> <font color="#008000">"eServer_ProcessIndicationProvider: disableIndications"</font> <font color="4444FF"><</font><font color="4444FF"><</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"><</font><font color="#2040a0">Thread</font> <font color="4444FF">*</font><font color="4444FF">></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"><</font><font color="#2040a0">ProcessIndicationProvider</font> <font color="4444FF">*</font><font color="4444FF">></font><font color="4444FF">(</font><font color="#2040a0">th</font><font color="4444FF">-</font><font color="4444FF">></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">></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">></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">></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">"root/PG_Interop:CIM_ProcessIndication"</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">"IndicationTime"</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">"IndicationIdentifier"</font>, <font color="#008000">"ProcessIndication01"</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"><</font><font color="#2040a0">String</font><font color="4444FF">></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">"CorrelatedIndications"</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">></font><font color="#2040a0">_response_handler</font><font color="4444FF">-</font><font color="4444FF">></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">></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">"C"</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">&</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">"ProcessIndicationProvider"</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">"ProcessIndicationProvider2"</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">"eServer_ProcessIndicationProvider"</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">"eServer_ProcessIndicationConsumer"</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">&</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">&</font> <font color="#2040a0">indication</font>, |
|
<a name="13_line6" href="#13_line6"> 6</a> <font color="#2040a0">ResponseHandler</font><font color="4444FF"><</font><strong>void</strong><font color="4444FF">></font> <font color="4444FF">&</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"><</font><font color="4444FF"><</font> |
|
<a name="13_line11" href="#13_line11">11</a> <font color="#008000">"Indication Consumer: recieved indication of class: "</font> <font color="4444FF"><</font><font color="4444FF"><</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"><</font><font color="4444FF"><</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">&</font> <font color="#2040a0">context</font>, <strong>const</strong> <font color="#2040a0">CIMIndication</font> <font color="4444FF">&</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">></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">></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">></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">></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">></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">></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">"eServerIndicationService::_handleProcessIndicationRequest"</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">></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">></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"><</font><font color="#2040a0">String</font><font color="4444FF">></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"><</font><font color="#2040a0">CIMInstance</font><font color="4444FF">></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">></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"><</font><font color="#2040a0">CIMObjectPath</font><font color="4444FF">></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">&</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">></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">&</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">></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">></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">"Internal Error"</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"><</font><font color="#2040a0">CIMInstance</font><font color="4444FF">></font> <font color="4444FF">&</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">&</font> <font color="#2040a0">indication</font>, |
|
<a name="16_line11" href="#16_line11"> 11</a> <font color="#2040a0">Array</font><font color="4444FF"><</font><font color="#2040a0">CIMObjectPath</font><font color="4444FF">></font> <font color="4444FF">&</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">"eServerIndicationService::_deliverIndication"</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"><</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">"Handler"</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">></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"><</font><font color="#2040a0">AsyncLegacyOperationStart</font> <font color="4444FF">*</font><font color="4444FF">></font><font color="4444FF">(</font><font color="#2040a0">op</font><font color="4444FF">-</font><font color="4444FF">></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">></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"><</font><font color="#2040a0">AsyncLegacyOperationStart</font> <font color="4444FF">*</font><font color="4444FF">></font><font color="4444FF">(</font><font color="#2040a0">op</font><font color="4444FF">-</font><font color="4444FF">></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">></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> |