1*7a0c41d5SAlan Somers /*- 2*7a0c41d5SAlan Somers * Copyright (c) 2013 Spectra Logic Corporation 3*7a0c41d5SAlan Somers * All rights reserved. 4*7a0c41d5SAlan Somers * 5*7a0c41d5SAlan Somers * Redistribution and use in source and binary forms, with or without 6*7a0c41d5SAlan Somers * modification, are permitted provided that the following conditions 7*7a0c41d5SAlan Somers * are met: 8*7a0c41d5SAlan Somers * 1. Redistributions of source code must retain the above copyright 9*7a0c41d5SAlan Somers * notice, this list of conditions, and the following disclaimer, 10*7a0c41d5SAlan Somers * without modification. 11*7a0c41d5SAlan Somers * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12*7a0c41d5SAlan Somers * substantially similar to the "NO WARRANTY" disclaimer below 13*7a0c41d5SAlan Somers * ("Disclaimer") and any redistribution must be conditioned upon 14*7a0c41d5SAlan Somers * including a substantially similar Disclaimer requirement for further 15*7a0c41d5SAlan Somers * binary redistribution. 16*7a0c41d5SAlan Somers * 17*7a0c41d5SAlan Somers * NO WARRANTY 18*7a0c41d5SAlan Somers * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19*7a0c41d5SAlan Somers * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20*7a0c41d5SAlan Somers * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21*7a0c41d5SAlan Somers * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22*7a0c41d5SAlan Somers * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*7a0c41d5SAlan Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24*7a0c41d5SAlan Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25*7a0c41d5SAlan Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26*7a0c41d5SAlan Somers * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27*7a0c41d5SAlan Somers * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*7a0c41d5SAlan Somers * POSSIBILITY OF SUCH DAMAGES. 29*7a0c41d5SAlan Somers * 30*7a0c41d5SAlan Somers * Authors: Justin T. Gibbs (Spectra Logic Corporation) 31*7a0c41d5SAlan Somers * 32*7a0c41d5SAlan Somers * $FreeBSD$ 33*7a0c41d5SAlan Somers */ 34*7a0c41d5SAlan Somers 35*7a0c41d5SAlan Somers /** 36*7a0c41d5SAlan Somers * \file devdctl_event_factory.h 37*7a0c41d5SAlan Somers */ 38*7a0c41d5SAlan Somers 39*7a0c41d5SAlan Somers #ifndef _DEVDCTL_EVENT_FACTORY_H_ 40*7a0c41d5SAlan Somers #define _DEVDCTL_EVENT_FACTORY_H_ 41*7a0c41d5SAlan Somers 42*7a0c41d5SAlan Somers /*============================ Namespace Control =============================*/ 43*7a0c41d5SAlan Somers namespace DevdCtl 44*7a0c41d5SAlan Somers { 45*7a0c41d5SAlan Somers 46*7a0c41d5SAlan Somers /*============================= Class Definitions ============================*/ 47*7a0c41d5SAlan Somers /*------------------------------- EventFactory -------------------------------*/ 48*7a0c41d5SAlan Somers /** 49*7a0c41d5SAlan Somers * \brief Container for "event type" => "event object" creation methods. 50*7a0c41d5SAlan Somers */ 51*7a0c41d5SAlan Somers class EventFactory 52*7a0c41d5SAlan Somers { 53*7a0c41d5SAlan Somers public: 54*7a0c41d5SAlan Somers /** 55*7a0c41d5SAlan Somers * Event creation handlers are matched by event type and a 56*7a0c41d5SAlan Somers * string representing the system emitting the event. 57*7a0c41d5SAlan Somers */ 58*7a0c41d5SAlan Somers typedef std::pair<Event::Type, std::string> Key; 59*7a0c41d5SAlan Somers 60*7a0c41d5SAlan Somers /** Map type for Factory method lookups. */ 61*7a0c41d5SAlan Somers typedef std::map<Key, Event::BuildMethod *> Registry; 62*7a0c41d5SAlan Somers 63*7a0c41d5SAlan Somers /** Table record of factory methods to add to our registry. */ 64*7a0c41d5SAlan Somers struct Record 65*7a0c41d5SAlan Somers { 66*7a0c41d5SAlan Somers Event::Type m_type; 67*7a0c41d5SAlan Somers const char *m_subsystem; 68*7a0c41d5SAlan Somers Event::BuildMethod *m_buildMethod; 69*7a0c41d5SAlan Somers }; 70*7a0c41d5SAlan Somers 71*7a0c41d5SAlan Somers const Registry &GetRegistry() const; 72*7a0c41d5SAlan Somers Event *Build(Event::Type type, NVPairMap &nvpairs, 73*7a0c41d5SAlan Somers const std::string eventString) const; 74*7a0c41d5SAlan Somers 75*7a0c41d5SAlan Somers EventFactory(Event::BuildMethod *defaultBuildMethod = NULL); 76*7a0c41d5SAlan Somers 77*7a0c41d5SAlan Somers void UpdateRegistry(Record regEntries[], size_t numEntries); 78*7a0c41d5SAlan Somers 79*7a0c41d5SAlan Somers 80*7a0c41d5SAlan Somers protected: 81*7a0c41d5SAlan Somers /** Registry of event factory methods providing O(log(n)) lookup. */ 82*7a0c41d5SAlan Somers Registry m_registry; 83*7a0c41d5SAlan Somers 84*7a0c41d5SAlan Somers Event::BuildMethod *m_defaultBuildMethod; 85*7a0c41d5SAlan Somers }; 86*7a0c41d5SAlan Somers 87*7a0c41d5SAlan Somers inline const EventFactory::Registry & 88*7a0c41d5SAlan Somers EventFactory::GetRegistry() const 89*7a0c41d5SAlan Somers { 90*7a0c41d5SAlan Somers return (m_registry); 91*7a0c41d5SAlan Somers } 92*7a0c41d5SAlan Somers 93*7a0c41d5SAlan Somers } // namespace DevdCtl 94*7a0c41d5SAlan Somers #endif /*_DEVDCTL_EVENT_FACTORY_H_ */ 95