Skip to content
Snippets Groups Projects
  1. Jun 21, 2022
  2. Jun 18, 2022
    • Nat Goodspeed's avatar
      DRTVWR-564: WIP: Add LazyEventAPI and tests. Tests don't yet pass. · af4fbc1f
      Nat Goodspeed authored
      LazyEventAPI is a registrar that implicitly instantiates some particular
      LLEventAPI subclass on demand: that is, when LLEventPumps::obtain() tries to
      find an LLEventPump by the registered name.
      
      This leverages the new LLEventPumps::registerPumpFactory() machinery. Fix
      registerPumpFactory() to adapt the passed PumpFactory to accept TypeFactory
      parameters (two of which it ignores). Supplement it with
      unregisterPumpFactory() to support LazyEventAPI instances with lifespans
      shorter than the process -- which may be mostly test programs, but still a
      hole worth closing. Similarly, add unregisterTypeFactory().
      
      A LazyEventAPI subclass takes over responsibility for specifying the
      LLEventAPI's name, desc, field, plus whatever add() calls will be needed to
      register the LLEventAPI's operations. This is so we can (later) enhance
      LLLeapListener to consult LazyEventAPI instances for not-yet-instantiated
      LLEventAPI metadata, as well as enumerating existing LLEventAPI instances.
      
      The trickiest part of this is capturing calls to the various
      LLEventDispatcher::add() overloads in such a way that, when the LLEventAPI
      subclass is eventually instantiated, we can replay them in the new instance.
      
      LLEventAPI acquires a new protected constructor specifically for use by a
      subclass registered by a companion LazyEventAPI. It accepts a const reference
      to LazyEventAPIParams, intended to be opaque to the LLEventAPI subclass; the
      subclass must declare a constructor that accepts and forwards the parameter
      block to the new LLEventAPI constructor. The implementation delegates to the
      existing LLEventAPI constructor, plus it runs deferred add() calls.
      
      LLDispatchListener now derives from LLEventStream instead of containing it as
      a data member. The reason is that if LLEventPumps::obtain() implicitly
      instantiates it, LLEventPumps's destructor will try to destroy it by deleting
      the LLEventPump*. If the LLEventPump returned by the factory function is a
      data member of an outer class, that won't work so well. But if
      LLDispatchListener (and by implication, LLEventAPI and any subclass) is
      derived from LLEventPump, then the virtual destructor will Do The Right Thing.
      
      Change LLDispatchListener to *not* allow tweaking the LLEventPump name. Since
      the overwhelming use case for LLDispatchListener is LLEventAPI, accepting but
      silently renaming an LLEventAPI subclass would ensure nobody could reach it.
      
      Change LLEventDispatcher's use of std::enable_if to control the set of add()
      overloads available for the intended use cases. Apparently this formulation is
      just as functional at the method declaration point, while avoiding the need to
      restate the whole enable_if expression at the method definition point.
      
      Add lazyeventapi_test.cpp to exercise.
      af4fbc1f
  3. Jun 15, 2022
    • Nat Goodspeed's avatar
      DRTVWR-558: LLEventAPI allows all LLEventDispatcher add() overloads. · f134eace
      Nat Goodspeed authored
      Previously, LLEventAPI intentionally hid all but one of the many add()
      overloads supported by its LLEventDispatcher base class. The reason was that
      certain of the add() methods take an optional fourth parameter that's an
      LLSD::Map describing the expected parameter structure, while others take a
      fourth templated parameter that's an instance getter callable. This led to
      ambiguity, especially when passed an LLSDMap instance that's convertible to
      LLSD but isn't literally LLSD. At the time, it was simpler to constrain the
      add() methods inherited from LLEventDispatcher.
      
      But by adding new std::enable_if constraints to certain LLEventDispatcher
      add() methods, we've resolved the ambiguities, so LLEventAPI subclasses can
      now use any add() overload (as claimed on the relevant Confluence page).
      
      LLEventDispatcher comments have always loftily claimed that an instance getter
      callable may return either a pointer or a reference, doesn't matter. But it
      does when trying to pass the getter's result to boost::fusion::push_back(): a
      reference must be wrapped with std::ref() while a pointer cannot be.
      std::ref(pointer) produces errors. Introduce LLEventDispatcher::invoker::
      bindable() overloads to Do The Right Thing whether passed a pointer or a
      reference.
      
      (cherry picked from commit 743f487c2e123171c9fc6d5b84d768f1d856d569)
      f134eace
  4. Nov 10, 2015
  5. Apr 24, 2013
  6. Mar 29, 2013
  7. Feb 28, 2013
  8. Sep 08, 2011
  9. Sep 06, 2011
  10. Sep 01, 2011
  11. Oct 13, 2010
  12. Sep 21, 2010
  13. Aug 13, 2010
  14. Nov 12, 2009
    • Nat Goodspeed's avatar
      Introduce LLEventDispatcher::begin()/end() to iterate over (name, desc) pairs · 2f97829a
      Nat Goodspeed authored
      for all registered operations. (untested)
      Introduce LLEventDispatcher::getMetadata(name) query so you can discover, for
      a given named operation, its query string and required parameters. (untested)
      Introduce LLEventDispatcher::add() convenience methods allowing you to omit
      description strings. Fix LLLoginInstance (which uses a non-LLEventAPI
      LLEventDispatcher) back to description-less add() calls.
      However, filter LLEventDispatcher::add() methods inherited by LLEventAPI so
      that an LLEventAPI subclass *must* provide a description string.
      2f97829a
  15. Nov 11, 2009
Loading