void ServiceType::Unregister(const ConnectionPtr& connection, const Dob::Typesystem::HandlerId& handlerId) { const ContextId context = connection->Id().m_contextId; if (m_typeIsContextShared && context != 0) { std::wostringstream ostr; ostr << "Service " << Typesystem::Operations::GetName(m_typeId) << ", which is ContextShared, can only be unregistered from context 0."; throw Safir::Dob::Typesystem::SoftwareViolationException(ostr.str(),__WFILE__,__LINE__); } ScopedTypeLock lck(m_typeLocks[context]); if (handlerId == Dob::Typesystem::HandlerId::ALL_HANDLERS) { m_handlerRegistrations[context].UnregisterAll(connection, true); // true => explicit unregister } else { m_handlerRegistrations[context].Unregister(connection, handlerId); } }
bool ServiceType::Register(const ConnectionPtr& connection, const Dob::Typesystem::HandlerId& handlerId, LamportClock& regClock, const bool overrideRegistration, const ConsumerId& consumer) { const ContextId context = connection->Id().m_contextId; if (m_typeIsContextShared && context != 0) { std::wostringstream ostr; ostr << "Service " << Typesystem::Operations::GetName(m_typeId) << ", which is ContextShared, can only be registered from context 0."; throw Safir::Dob::Typesystem::SoftwareViolationException(ostr.str(),__WFILE__,__LINE__); } ScopedTypeLock lck(m_typeLocks[context]); // Important to update the registration clock with the lock taken RegisterTime regTime = regClock.GetNewTimestamp(); return m_handlerRegistrations[context].Register(connection, handlerId, Dob::InstanceIdPolicy::RequestorDecidesInstanceId, // Dummy for services false, // false => no injection handler regTime, overrideRegistration, consumer); }
void ServiceType::UnregisterAll(const ConnectionPtr& connection, const bool explicitUnregister) { const ContextId context = connection->Id().m_contextId; ScopedTypeLock lck(m_typeLocks[context]); m_handlerRegistrations[context].UnregisterAll(connection, explicitUnregister); }
bool ServiceType::HasRegistrationSubscription(const ConnectionPtr& connection, const ConsumerId& consumer) const { // If it is a ContextShared type we use context 0, otherwise we use the same context as the subscriber. ContextId context = 0; if (!m_typeIsContextShared) { context = connection->Id().m_contextId; } return m_handlerRegistrations[context].HasSubscription(connection, consumer); }
void ServiceType::UnsubscribeRegistrationAll(const ConnectionPtr& connection) { // If it is a ContextShared type we use context 0, otherwise we use the same context as the subscriber. ContextId context = 0; if (!m_typeIsContextShared) { context = connection->Id().m_contextId; } ScopedTypeLock lck(m_typeLocks[context]); m_handlerRegistrations[context].UnsubscribeAll(connection); }