private void RerouteEnvelope <T>(IEnvelopeV1 <T> envelope) { var thisCrumbs = this.Identifier.Breadcrumbs; var envelopeCrumbs = envelope.RecipientId.Breadcrumbs; // Find common ancestor between breadcrumbms int thisIndexResult = -1; int recipientIndexResult = -1; for (var thisIndex = thisCrumbs.Length - 1; thisIndex >= 0; thisIndex--) { for (var recipientIndex = 0; recipientIndex < envelopeCrumbs.Length; recipientIndex++) { if (thisCrumbs[thisIndex] == envelopeCrumbs[recipientIndex]) { thisIndexResult = thisIndex; recipientIndexResult = recipientIndex; goto loop_exit; } } } loop_exit: if (thisIndexResult == -1 || recipientIndexResult == -1) { return; // drop packet } var newRoute = new Guid[(thisCrumbs.Length - thisIndexResult - 1) + (envelopeCrumbs.Length - recipientIndexResult - 1) + 1]; var newRouteIndex = 0; for (var i = thisCrumbs.Length - 1; i >= thisIndexResult; i--) { newRoute[newRouteIndex++] = thisCrumbs[i]; } for (var i = recipientIndexResult + 1; i < envelopeCrumbs.Length; i++) { newRoute[newRouteIndex++] = envelopeCrumbs[i]; } RouteEnvelope(envelope.GetReroutedEnvelope(newRoute)); }
public static IEnvelopeV1 <T> GetEnvelopeForNextHop <T>(this IEnvelopeV1 <T> envelope) { return(envelope.GetReroutedEnvelope(envelope.HopsToDestination.SubArray(1))); }