protected virtual uint CalculateLifetimeCount(double publishingInterval, uint keepAliveCount, uint lifetimeCount)
{
double lifetimeInterval = lifetimeCount*publishingInterval;
// lifetime cannot be longer than the max subscription lifetime.
if (lifetimeInterval > m_maxSubscriptionLifetime)
{
lifetimeCount = (uint)(m_maxSubscriptionLifetime/publishingInterval);
if (lifetimeCount < UInt32.MaxValue)
{
if (m_maxSubscriptionLifetime % publishingInterval != 0)
{
lifetimeCount++;
}
}
}
// the lifetime must be greater than the keepalive.
if (keepAliveCount < UInt32.MaxValue / 3)
{
if (keepAliveCount * 3 > lifetimeCount)
{
lifetimeCount = keepAliveCount * 3;
}
lifetimeInterval = lifetimeCount * publishingInterval;
}
else
{
lifetimeCount = UInt32.MaxValue;
lifetimeInterval = Double.MaxValue;
}
// apply the minimum.
if (m_minSubscriptionLifetime > publishingInterval && m_minSubscriptionLifetime > lifetimeInterval)
{
lifetimeCount = (uint)(m_minSubscriptionLifetime/publishingInterval);
if (lifetimeCount < UInt32.MaxValue)
{
if (m_minSubscriptionLifetime%publishingInterval != 0)
{
lifetimeCount++;
}
}
}
return lifetimeCount;
}