Esempio n. 1
0
        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));
        }
Esempio n. 2
0
 public static IEnvelopeV1 <T> GetEnvelopeForNextHop <T>(this IEnvelopeV1 <T> envelope)
 {
     return(envelope.GetReroutedEnvelope(envelope.HopsToDestination.SubArray(1)));
 }