in iothub/device/src/Transport/Mqtt/MqttIotHubAdapter.cs [1319:1374]
public static bool CheckTopicFilterMatch(string topicName, string topicFilter)
{
int topicFilterIndex = 0;
int topicNameIndex = 0;
while (topicNameIndex < topicName.Length && topicFilterIndex < topicFilter.Length)
{
int wildcardIndex = topicFilter.IndexOfAny(s_wildcardChars, topicFilterIndex);
if (wildcardIndex == -1)
{
int matchLength = Math.Max(topicFilter.Length - topicFilterIndex, topicName.Length - topicNameIndex);
return string.Compare(topicFilter, topicFilterIndex, topicName, topicNameIndex, matchLength, StringComparison.Ordinal) == 0;
}
else
{
if (topicFilter[wildcardIndex] == MultiSegmentWildcardChar)
{
if (wildcardIndex == 0) // special case -- any topic name would match
{
return true;
}
else
{
int matchLength = wildcardIndex - topicFilterIndex - 1;
if (string.Compare(topicFilter, topicFilterIndex, topicName, topicNameIndex, matchLength, StringComparison.Ordinal) == 0
&& (topicName.Length == topicNameIndex + matchLength || (topicName.Length > topicNameIndex + matchLength && topicName[topicNameIndex + matchLength] == SegmentSeparatorChar)))
{
// paths match up till wildcard and either it is parent topic in hierarchy (one level above # specified) or any child topic under a matching parent topic
return true;
}
else
{
return false;
}
}
}
else
{
// single segment wildcard
int matchLength = wildcardIndex - topicFilterIndex;
if (matchLength > 0 && string.Compare(topicFilter, topicFilterIndex, topicName, topicNameIndex, matchLength, StringComparison.Ordinal) != 0)
{
return false;
}
topicNameIndex = topicName.IndexOf(SegmentSeparatorChar, topicNameIndex + matchLength);
topicFilterIndex = wildcardIndex + 1;
if (topicNameIndex == -1)
{
// there's no more segments following matched one
return topicFilterIndex == topicFilter.Length;
}
}
}
}
return topicFilterIndex == topicFilter.Length && topicNameIndex == topicName.Length;
}