[Libvirt-cim] [PATCH 2 of 2] [CU] Improve std_indication's raise functionality

Jay Gagnon grendel at linux.vnet.ibm.com
Fri Feb 1 16:23:18 UTC 2008


# HG changeset patch
# User Jay Gagnon <grendel at linux.vnet.ibm.com>
# Date 1201882988 18000
# Node ID 8669586635358e4858e56fe2dec8587af784cd47
# Parent  ec7428b062f45db8eef730c5398d061d8731ce60
[CU] Improve std_indication's raise functionality

Turns out STDI_IndicationMIStub was not creating the CMPIFooMIFTs correctly; this patch fixes that.  It also adds a default_raise function to std_indication.  This is for indication providers that don't need to do anything other than call CBDeliverIndication, which will most likely be the majority.

Signed-off-by: Jay Gagnon <grendel at linux.vnet.ibm.com>

diff -r ec7428b062f4 -r 866958663535 std_indication.c
--- a/std_indication.c	Thu Jan 31 10:59:07 2008 -0500
+++ b/std_indication.c	Fri Feb 01 11:23:08 2008 -0500
@@ -19,6 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
  */
 #include <string.h>
+#include <stdbool.h>
 
 #include <cmpidt.h>
 #include <cmpift.h>
@@ -40,19 +41,40 @@ static CMPIStatus trigger(struct std_ind
         return ctx->handler->trigger_fn(context);
 }
 
+static CMPIStatus default_raise(const CMPIBroker *broker,
+                                const CMPIContext *context,
+                                CMPIInstance *ind)
+{
+        CMPIObjectPath *ref;
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+
+        ref = CMGetObjectPath(ind, NULL);
+        
+        CBDeliverIndication(broker,
+                            context, 
+                            NAMESPACE(ref), 
+                            ind);
+        return s;
+}
+
 static CMPIStatus raise(struct std_indication_ctx *ctx,
                         const CMPIContext *context,
                         const CMPIArgs *argsin)
 {
         CMPIInstance *inst;
 
-        if (ctx->handler->raise_fn == NULL)
-                return (CMPIStatus){CMPI_RC_OK, NULL};
+        if (!ctx->enabled) {
+                CU_DEBUG("Indication disabled, not raising.");
+                return (CMPIStatus) {CMPI_RC_OK, NULL};
+        }
 
         if (cu_get_inst_arg(argsin, "Indication", &inst) != CMPI_RC_OK)
                 return (CMPIStatus){CMPI_RC_ERR_FAILED, NULL};
 
-        return ctx->handler->raise_fn(context, inst);
+        if (ctx->handler->raise_fn == NULL)
+                return default_raise(ctx->brkr, context, inst);
+
+        return ctx->handler->raise_fn(ctx->brkr, context, inst);
 }
 
 CMPIStatus stdi_handler(CMPIMethodMI *self,
diff -r ec7428b062f4 -r 866958663535 std_indication.h
--- a/std_indication.h	Thu Jan 31 10:59:07 2008 -0500
+++ b/std_indication.h	Fri Feb 01 11:23:08 2008 -0500
@@ -24,6 +24,7 @@
 #include <cmpidt.h>
 #include <cmpift.h>
 #include <cmpimacs.h>
+#include <stdio.h>
 
 #include "libcmpiutil.h"
 #include "std_invokemethod.h"
@@ -51,7 +52,8 @@ CMPIStatus stdi_cleanup(CMPIMethodMI *se
                         const CMPIContext *context,
                         CMPIBoolean terminating);
 
-typedef CMPIStatus (*raise_indication_t)(const CMPIContext *ctx,
+typedef CMPIStatus (*raise_indication_t)(const CMPIBroker *broker,
+                                         const CMPIContext *ctx,
                                          const CMPIInstance *ind);
 
 typedef CMPIStatus (*trigger_indication_t)(const CMPIContext *ctx);
@@ -64,14 +66,44 @@ struct std_indication_ctx {
 struct std_indication_ctx {
         const CMPIBroker *brkr;
         struct std_indication_handler *handler;
+        bool enabled;
 };
 
 #define STDI_IndicationMIStub(pfx, pn, _broker, hook, _handler)         \
+        static struct std_indication_ctx _ctx = {                       \
+                .brkr = NULL,                                           \
+                .handler = _handler,                                    \
+                .enabled = false,                                       \
+        };                                                              \
+                                                                        \
+        static CMPIIndicationMIFT indMIFT__ = {                         \
+                CMPICurrentVersion,                                     \
+                CMPICurrentVersion,                                     \
+                "Indication" #pn,                                       \
+                pfx##IndicationCleanup,                                 \
+                pfx##AuthorizeFilter,                                   \
+                pfx##MustPoll,                                          \
+                pfx##ActivateFilter,                                    \
+                pfx##DeActivateFilter,                                  \
+                CMIndicationMIStubExtensions(pfx)                       \
+        };                                                              \
         CMPIIndicationMI *                                              \
         pn##_Create_IndicationMI(const CMPIBroker *,                    \
-                                const CMPIContext *,                    \
-                                CMPIStatus *);                          \
-        CMIndicationMIStub(pfx, pn, _broker, hook);                     \
+                                 const CMPIContext *,                   \
+                                 CMPIStatus *);                         \
+        CMPIIndicationMI *                                              \
+        pn##_Create_IndicationMI(const CMPIBroker *brkr,                \
+                                  const CMPIContext *ctx,               \
+                                  CMPIStatus *rc) {                     \
+                static CMPIIndicationMI mi = {                          \
+                        &_ctx,                                          \
+                        &indMIFT__,                                     \
+                };                                                      \
+                _ctx.brkr = brkr;                                       \
+                _broker = brkr;                                         \
+                hook;                                                   \
+                return &mi;                                             \
+        }                                                               \
                                                                         \
         static CMPIMethodMIFT methMIFT__ = {                            \
                 CMPICurrentVersion,                                     \
@@ -88,13 +120,11 @@ struct std_indication_ctx {
         CMPIMethodMI *pn##_Create_MethodMI(const CMPIBroker *brkr,      \
                                            const CMPIContext *ctx,      \
                                            CMPIStatus *rc) {            \
-                static struct std_indication_ctx _ctx;                  \
                 static CMPIMethodMI mi = {                              \
                         &_ctx,                                          \
                         &methMIFT__,                                    \
                 };                                                      \
                 _ctx.brkr = brkr;                                       \
-                _ctx.handler = _handler;                                \
                 _broker = brkr;                                         \
                 hook;                                                   \
                 return &mi;                                             \




More information about the Libvirt-cim mailing list