/*============================================================================= Library: CppMicroServices Copyright (c) The CppMicroServices developers. See the COPYRIGHT file at the top-level directory of this distribution and at https://github.com/CppMicroServices/CppMicroServices/COPYRIGHT . Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. =============================================================================*/ #ifndef CPPMICROSERVICES_SERVICETRACKERCUSTOMIZER_H #define CPPMICROSERVICES_SERVICETRACKERCUSTOMIZER_H #include "cppmicroservices/ServiceReference.h" namespace cppmicroservices { /** * \ingroup MicroServices * \ingroup gr_servicetracker * * The ServiceTrackerCustomizer interface allows a * ServiceTracker to customize the service objects that are * tracked. A ServiceTrackerCustomizer is called when a service is * being added to a ServiceTracker. The * ServiceTrackerCustomizer can then return an object for the * tracked service. A ServiceTrackerCustomizer is also called when * a tracked service is modified or has been removed from a * ServiceTracker. * * The methods in this interface may be called as the result of a * ServiceEvent being received by a ServiceTracker. * Since ServiceEvents are synchronously delivered, * it is highly recommended that implementations of these methods do * not register (BundleContext::RegisterService), modify ( * ServiceRegistration::SetProperties) or unregister ( * ServiceRegistration::Unregister) a service while being * synchronized on any object. * * The ServiceTracker class is thread-safe. It does not call a * ServiceTrackerCustomizer while holding any locks. * ServiceTrackerCustomizer implementations must also be * thread-safe. * * \tparam S The type of the service being tracked * \tparam T The type of the tracked object. The default is \c S. * \remarks This class is thread safe. */ template struct ServiceTrackerCustomizer { struct TypeTraits { typedef S ServiceType; typedef T TrackedType; typedef T TrackedParmType; static std::shared_ptr ConvertToTrackedType( const std::shared_ptr&) { throw std::runtime_error("A custom ServiceTrackerCustomizer instance is " "required for custom tracked objects."); } }; typedef typename TypeTraits::TrackedParmType TrackedParmType; virtual ~ServiceTrackerCustomizer() {} /** * A service is being added to the ServiceTracker. * *

* This method is called before a service which matched the search * parameters of the ServiceTracker is added to the * ServiceTracker. This method should return the service object * to be tracked for the specified ServiceReference. The * returned service object is stored in the ServiceTracker and * is available from the GetService and * GetServices methods. * * @param reference The reference to the service being added to the * ServiceTracker. * @return The service object to be tracked for the specified referenced * service or 0 if the specified referenced service * should not be tracked. */ virtual std::shared_ptr AddingService( const ServiceReference& reference) = 0; /** * A service tracked by the ServiceTracker has been modified. * *

* This method is called when a service being tracked by the * ServiceTracker has had it properties modified. * * @param reference The reference to the service that has been modified. * @param service The service object for the specified referenced service. */ virtual void ModifiedService( const ServiceReference& reference, const std::shared_ptr& service) = 0; /** * A service tracked by the ServiceTracker has been removed. * *

* This method is called after a service is no longer being tracked by the * ServiceTracker. * * @param reference The reference to the service that has been removed. * @param service The service object for the specified referenced service. */ virtual void RemovedService( const ServiceReference& reference, const std::shared_ptr& service) = 0; }; template struct ServiceTrackerCustomizer { struct TypeTraits { typedef S ServiceType; typedef S TrackedType; typedef S TrackedParmType; static std::shared_ptr ConvertToTrackedType(const std::shared_ptr& t) { return t; } }; typedef typename TypeTraits::TrackedParmType TrackedParmType; virtual ~ServiceTrackerCustomizer() {} virtual std::shared_ptr AddingService( const ServiceReference& reference) = 0; virtual void ModifiedService( const ServiceReference& reference, const std::shared_ptr& service) = 0; virtual void RemovedService( const ServiceReference& reference, const std::shared_ptr& service) = 0; }; template struct ServiceTrackerCustomizer { struct TypeTraits { typedef void ServiceType; typedef T TrackedType; typedef T TrackedParmType; static std::shared_ptr ConvertToTrackedType(const InterfaceMapConstPtr&) { throw std::runtime_error("A custom ServiceTrackerCustomizer instance is " "required for custom tracked objects."); } }; typedef void S; typedef typename TypeTraits::TrackedParmType TrackedParmType; virtual ~ServiceTrackerCustomizer() {} virtual std::shared_ptr AddingService( const ServiceReference& reference) = 0; virtual void ModifiedService( const ServiceReference& reference, const std::shared_ptr& service) = 0; virtual void RemovedService( const ServiceReference& reference, const std::shared_ptr& service) = 0; }; template<> struct ServiceTrackerCustomizer { struct TypeTraits { typedef void ServiceType; typedef void TrackedType; typedef const InterfaceMap TrackedParmType; static std::shared_ptr ConvertToTrackedType( const std::shared_ptr& t) { return t; } }; typedef void S; typedef void T; typedef TypeTraits::TrackedParmType TrackedParmType; virtual ~ServiceTrackerCustomizer() {} virtual std::shared_ptr AddingService( const ServiceReference& reference) = 0; virtual void ModifiedService( const ServiceReference& reference, const std::shared_ptr& service) = 0; virtual void RemovedService( const ServiceReference& reference, const std::shared_ptr& service) = 0; }; } #endif // CPPMICROSERVICES_SERVICETRACKERCUSTOMIZER_H