//%LICENSE////////////////////////////////////////////////////////////////
//
// Licensed to The Open Group (TOG) under one or more contributor license
// agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
// this work for additional information regarding copyright ownership.
// Each contributor licenses this file to you under the OpenPegasus Open
// Source License; you may not use this file except in compliance with the
// License.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//////////////////////////////////////////////////////////////////////////
// EventDispatcher.cpp : Implementation of CEventDispatcher
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "WbemConsumer.h"
#include "EventDispatcher.h"

#include "Dispatcher.h"
#include "Converter.h"

#include "ConsumerTracer.h"

/////////////////////////////////////////////////////////////////////////////
// CEventDispatcher

STDMETHODIMP CEventDispatcher::IndicateToConsumer(
    IWbemClassObject * pLogicalConsumer, 
    LONG lNumObjects, 
    IWbemClassObject * * apObjects)
{
    CNS_METHOD_ENTER(
        Pegasus::TRC_WMI_MAPPER_CONSUMER, 
        "CEventDispatcher::IndicateToConsumer");
                                                             
    LONG lIndex = 0;

    Pegasus::CDispatcher dispatcher;
    CConverter converter;

    Pegasus::CIMInstance *indicationInstance;
    Pegasus::CIMInstance *handlerInstance;


    while(lIndex < lNumObjects) {

        IWbemClassObject *pObj = apObjects[lIndex];

        indicationInstance = new Pegasus::CIMInstance("__TMP_Name");
        handlerInstance = new Pegasus::CIMInstance("__TMP_Name2");

        try
        {

            //convert the indication instance from WMI to Pegasus object
            converter.convertIndicationWMI2Peg(
                pLogicalConsumer, 
                pObj, 
                indicationInstance);

            //convert the handler instance from WMI to Pegasus object
            converter.convertHandlerWMI2Peg(
                pLogicalConsumer, 
                handlerInstance);
        }
        catch (Pegasus::CIMException &e) 
        {
            CNS_TRACE((Pegasus::TRC_WMI_MAPPER_CONSUMER, 
                Pegasus::Tracer::LEVEL4,
                "CEventDispatcher::IndicateToConsumer - Exception Converting \
                WMIObj to CIM Pegasus Object."));  
        }

        try
        {
            //dispatch event
            dispatcher.dispatchIndication(
                *handlerInstance, *indicationInstance);
        }
        catch (Pegasus::CIMException &e) 
        {
            CNS_TRACE((
                Pegasus::TRC_WMI_MAPPER_CONSUMER,
                Pegasus::Tracer::LEVEL4,
                "CEventDispatcher::IndicateToConsumer - Exception Dispatching \
                CIMIndication Pegasus Object: %s", 
                e.getMessage()));
        }

        delete indicationInstance;
        delete handlerInstance;
        lIndex++;
    }
    CNS_METHOD_EXIT();

    return S_OK;
}
