com.wallstop-studios.dxmessaging 2.0.0-rc08 → 2.0.0-rc10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -33,42 +33,39 @@
|
|
|
33
33
|
|
|
34
34
|
public RegistrationLog Log => _log;
|
|
35
35
|
|
|
36
|
+
private readonly Dictionary<Type, SortedList<int, Dictionary<MessageHandler, int>>> _sinks =
|
|
37
|
+
new();
|
|
36
38
|
private readonly Dictionary<
|
|
37
39
|
Type,
|
|
38
|
-
|
|
39
|
-
> _sinks = new();
|
|
40
|
-
private readonly Dictionary<
|
|
41
|
-
Type,
|
|
42
|
-
Dictionary<InstanceId, SortedDictionary<int, Dictionary<MessageHandler, int>>>
|
|
40
|
+
Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
|
|
43
41
|
> _targetedSinks = new();
|
|
44
42
|
|
|
45
43
|
private readonly Dictionary<
|
|
46
44
|
Type,
|
|
47
|
-
Dictionary<InstanceId,
|
|
45
|
+
Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
|
|
48
46
|
> _broadcastSinks = new();
|
|
49
47
|
private readonly Dictionary<
|
|
50
48
|
Type,
|
|
51
|
-
|
|
49
|
+
SortedList<int, Dictionary<MessageHandler, int>>
|
|
52
50
|
> _postProcessingSinks = new();
|
|
53
51
|
private readonly Dictionary<
|
|
54
52
|
Type,
|
|
55
|
-
Dictionary<InstanceId,
|
|
53
|
+
Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
|
|
56
54
|
> _postProcessingTargetedSinks = new();
|
|
57
55
|
private readonly Dictionary<
|
|
58
56
|
Type,
|
|
59
|
-
Dictionary<InstanceId,
|
|
57
|
+
Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
|
|
60
58
|
> _postProcessingBroadcastSinks = new();
|
|
61
59
|
private readonly Dictionary<
|
|
62
60
|
Type,
|
|
63
|
-
|
|
61
|
+
SortedList<int, Dictionary<MessageHandler, int>>
|
|
64
62
|
> _postProcessingTargetedWithoutTargetingSinks = new();
|
|
65
63
|
private readonly Dictionary<
|
|
66
64
|
Type,
|
|
67
|
-
|
|
65
|
+
SortedList<int, Dictionary<MessageHandler, int>>
|
|
68
66
|
> _postProcessingBroadcastWithoutSourceSinks = new();
|
|
69
67
|
private readonly Dictionary<MessageHandler, int> _globalSinks = new();
|
|
70
|
-
private readonly Dictionary<Type,
|
|
71
|
-
new();
|
|
68
|
+
private readonly Dictionary<Type, SortedList<int, List<object>>> _interceptsByType = new();
|
|
72
69
|
private readonly Dictionary<object, Dictionary<int, int>> _uniqueInterceptorsAndPriorities =
|
|
73
70
|
new();
|
|
74
71
|
|
|
@@ -309,11 +306,11 @@
|
|
|
309
306
|
if (
|
|
310
307
|
!_interceptsByType.TryGetValue(
|
|
311
308
|
type,
|
|
312
|
-
out
|
|
309
|
+
out SortedList<int, List<object>> prioritizedInterceptors
|
|
313
310
|
)
|
|
314
311
|
)
|
|
315
312
|
{
|
|
316
|
-
prioritizedInterceptors = new
|
|
313
|
+
prioritizedInterceptors = new SortedList<int, List<object>>();
|
|
317
314
|
_interceptsByType[type] = prioritizedInterceptors;
|
|
318
315
|
}
|
|
319
316
|
|
|
@@ -394,12 +391,12 @@
|
|
|
394
391
|
bool complete = false;
|
|
395
392
|
if (removed)
|
|
396
393
|
{
|
|
397
|
-
if (
|
|
394
|
+
if (
|
|
395
|
+
_interceptsByType.TryGetValue(type, out prioritizedInterceptors)
|
|
396
|
+
&& prioritizedInterceptors.TryGetValue(priority, out interceptors)
|
|
397
|
+
)
|
|
398
398
|
{
|
|
399
|
-
|
|
400
|
-
{
|
|
401
|
-
complete = interceptors.Remove(interceptor);
|
|
402
|
-
}
|
|
399
|
+
complete = interceptors.Remove(interceptor);
|
|
403
400
|
}
|
|
404
401
|
|
|
405
402
|
if (!complete)
|
|
@@ -461,44 +458,35 @@
|
|
|
461
458
|
if (
|
|
462
459
|
_postProcessingSinks.TryGetValue(
|
|
463
460
|
type,
|
|
464
|
-
out
|
|
461
|
+
out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
|
|
465
462
|
)
|
|
466
463
|
&& 0 < sortedHandlers.Count
|
|
467
464
|
)
|
|
468
465
|
{
|
|
469
466
|
foundAnyHandlers = true;
|
|
470
|
-
|
|
471
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
472
|
-
try
|
|
467
|
+
if (sortedHandlers.Count == 1)
|
|
473
468
|
{
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
)
|
|
469
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
470
|
+
sortedHandlers.First();
|
|
471
|
+
RunUntargetedPostProcessing(ref typedMessage, entry.Key, entry.Value);
|
|
472
|
+
}
|
|
473
|
+
else
|
|
474
|
+
{
|
|
475
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
476
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
477
|
+
try
|
|
477
478
|
{
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
);
|
|
482
|
-
try
|
|
483
|
-
{
|
|
484
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
485
|
-
{
|
|
486
|
-
handler.HandleUntargetedPostProcessing(
|
|
487
|
-
ref typedMessage,
|
|
488
|
-
this,
|
|
489
|
-
priority
|
|
490
|
-
);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
finally
|
|
479
|
+
foreach (
|
|
480
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
481
|
+
)
|
|
494
482
|
{
|
|
495
|
-
|
|
483
|
+
RunUntargetedPostProcessing(ref typedMessage, entry.Key, entry.Value);
|
|
496
484
|
}
|
|
497
485
|
}
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
486
|
+
finally
|
|
487
|
+
{
|
|
488
|
+
_sortedHandlers.Push(handlerList);
|
|
489
|
+
}
|
|
502
490
|
}
|
|
503
491
|
}
|
|
504
492
|
|
|
@@ -512,6 +500,51 @@
|
|
|
512
500
|
}
|
|
513
501
|
}
|
|
514
502
|
|
|
503
|
+
private void RunUntargetedPostProcessing<TMessage>(
|
|
504
|
+
ref TMessage typedMessage,
|
|
505
|
+
int priority,
|
|
506
|
+
Dictionary<MessageHandler, int> handlers
|
|
507
|
+
)
|
|
508
|
+
where TMessage : IUntargetedMessage
|
|
509
|
+
{
|
|
510
|
+
switch (handlers.Count)
|
|
511
|
+
{
|
|
512
|
+
case <= 0:
|
|
513
|
+
{
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
case 1:
|
|
517
|
+
{
|
|
518
|
+
MessageHandler handler = handlers.Keys.First();
|
|
519
|
+
handler.HandleUntargetedPostProcessing(ref typedMessage, this, priority);
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
default:
|
|
523
|
+
{
|
|
524
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
525
|
+
handlers.Keys
|
|
526
|
+
);
|
|
527
|
+
try
|
|
528
|
+
{
|
|
529
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
530
|
+
{
|
|
531
|
+
handler.HandleUntargetedPostProcessing(
|
|
532
|
+
ref typedMessage,
|
|
533
|
+
this,
|
|
534
|
+
priority
|
|
535
|
+
);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
finally
|
|
539
|
+
{
|
|
540
|
+
_messageHandlers.Push(messageHandlers);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
break;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
515
548
|
public void UntypedTargetedBroadcast(InstanceId target, ITargetedMessage typedMessage)
|
|
516
549
|
{
|
|
517
550
|
Type messageType = typedMessage.MessageType;
|
|
@@ -561,50 +594,45 @@
|
|
|
561
594
|
type,
|
|
562
595
|
out Dictionary<
|
|
563
596
|
InstanceId,
|
|
564
|
-
|
|
597
|
+
SortedList<int, Dictionary<MessageHandler, int>>
|
|
565
598
|
> targetedHandlers
|
|
566
599
|
)
|
|
567
600
|
&& targetedHandlers.TryGetValue(
|
|
568
601
|
target,
|
|
569
|
-
out
|
|
602
|
+
out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
|
|
570
603
|
)
|
|
571
604
|
&& 0 < sortedHandlers.Count
|
|
572
605
|
)
|
|
573
606
|
{
|
|
574
607
|
foundAnyHandlers = true;
|
|
575
|
-
|
|
576
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
577
|
-
try
|
|
608
|
+
if (sortedHandlers.Count == 1)
|
|
578
609
|
{
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
)
|
|
610
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
611
|
+
sortedHandlers.First();
|
|
612
|
+
RunTargetedBroadcast(ref target, ref typedMessage, entry.Key, entry.Value);
|
|
613
|
+
}
|
|
614
|
+
else
|
|
615
|
+
{
|
|
616
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
617
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
618
|
+
try
|
|
582
619
|
{
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
);
|
|
587
|
-
try
|
|
588
|
-
{
|
|
589
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
590
|
-
{
|
|
591
|
-
handler.HandleTargeted(
|
|
592
|
-
ref target,
|
|
593
|
-
ref typedMessage,
|
|
594
|
-
this,
|
|
595
|
-
priority
|
|
596
|
-
);
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
finally
|
|
620
|
+
foreach (
|
|
621
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
622
|
+
)
|
|
600
623
|
{
|
|
601
|
-
|
|
624
|
+
RunTargetedBroadcast(
|
|
625
|
+
ref target,
|
|
626
|
+
ref typedMessage,
|
|
627
|
+
entry.Key,
|
|
628
|
+
entry.Value
|
|
629
|
+
);
|
|
602
630
|
}
|
|
603
631
|
}
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
632
|
+
finally
|
|
633
|
+
{
|
|
634
|
+
_sortedHandlers.Push(handlerList);
|
|
635
|
+
}
|
|
608
636
|
}
|
|
609
637
|
}
|
|
610
638
|
|
|
@@ -617,39 +645,34 @@
|
|
|
617
645
|
)
|
|
618
646
|
{
|
|
619
647
|
foundAnyHandlers = true;
|
|
620
|
-
|
|
621
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
622
|
-
try
|
|
648
|
+
if (sortedHandlers.Count == 1)
|
|
623
649
|
{
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
)
|
|
650
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
651
|
+
sortedHandlers.First();
|
|
652
|
+
RunTargetedPostProcessing(ref target, ref typedMessage, entry.Key, entry.Value);
|
|
653
|
+
}
|
|
654
|
+
else
|
|
655
|
+
{
|
|
656
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
657
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
658
|
+
try
|
|
627
659
|
{
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
);
|
|
632
|
-
try
|
|
660
|
+
foreach (
|
|
661
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
662
|
+
)
|
|
633
663
|
{
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
priority
|
|
641
|
-
);
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
finally
|
|
645
|
-
{
|
|
646
|
-
_messageHandlers.Push(messageHandlers);
|
|
664
|
+
RunTargetedPostProcessing(
|
|
665
|
+
ref target,
|
|
666
|
+
ref typedMessage,
|
|
667
|
+
entry.Key,
|
|
668
|
+
entry.Value
|
|
669
|
+
);
|
|
647
670
|
}
|
|
648
671
|
}
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
672
|
+
finally
|
|
673
|
+
{
|
|
674
|
+
_sortedHandlers.Push(handlerList);
|
|
675
|
+
}
|
|
653
676
|
}
|
|
654
677
|
}
|
|
655
678
|
|
|
@@ -658,39 +681,39 @@
|
|
|
658
681
|
&& 0 < sortedHandlers.Count
|
|
659
682
|
)
|
|
660
683
|
{
|
|
661
|
-
|
|
662
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
663
|
-
try
|
|
684
|
+
if (sortedHandlers.Count == 1)
|
|
664
685
|
{
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
686
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
687
|
+
sortedHandlers.First();
|
|
688
|
+
RunTargetedWithoutTargetingPostProcessing(
|
|
689
|
+
ref target,
|
|
690
|
+
ref typedMessage,
|
|
691
|
+
entry.Key,
|
|
692
|
+
entry.Value
|
|
693
|
+
);
|
|
694
|
+
}
|
|
695
|
+
else
|
|
696
|
+
{
|
|
697
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
698
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
699
|
+
try
|
|
668
700
|
{
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
);
|
|
673
|
-
try
|
|
701
|
+
foreach (
|
|
702
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
703
|
+
)
|
|
674
704
|
{
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
priority
|
|
682
|
-
);
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
finally
|
|
686
|
-
{
|
|
687
|
-
_messageHandlers.Push(messageHandlers);
|
|
705
|
+
RunTargetedWithoutTargetingPostProcessing(
|
|
706
|
+
ref target,
|
|
707
|
+
ref typedMessage,
|
|
708
|
+
entry.Key,
|
|
709
|
+
entry.Value
|
|
710
|
+
);
|
|
688
711
|
}
|
|
689
712
|
}
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
713
|
+
finally
|
|
714
|
+
{
|
|
715
|
+
_sortedHandlers.Push(handlerList);
|
|
716
|
+
}
|
|
694
717
|
}
|
|
695
718
|
}
|
|
696
719
|
|
|
@@ -705,6 +728,152 @@
|
|
|
705
728
|
}
|
|
706
729
|
}
|
|
707
730
|
|
|
731
|
+
private void RunTargetedWithoutTargetingPostProcessing<TMessage>(
|
|
732
|
+
ref InstanceId target,
|
|
733
|
+
ref TMessage typedMessage,
|
|
734
|
+
int priority,
|
|
735
|
+
Dictionary<MessageHandler, int> handlers
|
|
736
|
+
)
|
|
737
|
+
where TMessage : ITargetedMessage
|
|
738
|
+
{
|
|
739
|
+
switch (handlers.Count)
|
|
740
|
+
{
|
|
741
|
+
case <= 0:
|
|
742
|
+
{
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
745
|
+
case 1:
|
|
746
|
+
{
|
|
747
|
+
MessageHandler handler = handlers.Keys.First();
|
|
748
|
+
handler.HandleTargetedWithoutTargetingPostProcessing(
|
|
749
|
+
ref target,
|
|
750
|
+
ref typedMessage,
|
|
751
|
+
this,
|
|
752
|
+
priority
|
|
753
|
+
);
|
|
754
|
+
return;
|
|
755
|
+
}
|
|
756
|
+
default:
|
|
757
|
+
{
|
|
758
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
759
|
+
handlers.Keys
|
|
760
|
+
);
|
|
761
|
+
try
|
|
762
|
+
{
|
|
763
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
764
|
+
{
|
|
765
|
+
handler.HandleTargetedWithoutTargetingPostProcessing(
|
|
766
|
+
ref target,
|
|
767
|
+
ref typedMessage,
|
|
768
|
+
this,
|
|
769
|
+
priority
|
|
770
|
+
);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
finally
|
|
774
|
+
{
|
|
775
|
+
_messageHandlers.Push(messageHandlers);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
break;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
private void RunTargetedPostProcessing<TMessage>(
|
|
784
|
+
ref InstanceId target,
|
|
785
|
+
ref TMessage typedMessage,
|
|
786
|
+
int priority,
|
|
787
|
+
Dictionary<MessageHandler, int> handlers
|
|
788
|
+
)
|
|
789
|
+
where TMessage : ITargetedMessage
|
|
790
|
+
{
|
|
791
|
+
switch (handlers.Count)
|
|
792
|
+
{
|
|
793
|
+
case <= 0:
|
|
794
|
+
{
|
|
795
|
+
return;
|
|
796
|
+
}
|
|
797
|
+
case 1:
|
|
798
|
+
{
|
|
799
|
+
MessageHandler handler = handlers.Keys.First();
|
|
800
|
+
handler.HandleTargetedPostProcessing(
|
|
801
|
+
ref target,
|
|
802
|
+
ref typedMessage,
|
|
803
|
+
this,
|
|
804
|
+
priority
|
|
805
|
+
);
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
default:
|
|
809
|
+
{
|
|
810
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
811
|
+
handlers.Keys
|
|
812
|
+
);
|
|
813
|
+
try
|
|
814
|
+
{
|
|
815
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
816
|
+
{
|
|
817
|
+
handler.HandleTargetedPostProcessing(
|
|
818
|
+
ref target,
|
|
819
|
+
ref typedMessage,
|
|
820
|
+
this,
|
|
821
|
+
priority
|
|
822
|
+
);
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
finally
|
|
826
|
+
{
|
|
827
|
+
_messageHandlers.Push(messageHandlers);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
break;
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
private void RunTargetedBroadcast<TMessage>(
|
|
836
|
+
ref InstanceId target,
|
|
837
|
+
ref TMessage typedMessage,
|
|
838
|
+
int priority,
|
|
839
|
+
Dictionary<MessageHandler, int> handlers
|
|
840
|
+
)
|
|
841
|
+
where TMessage : ITargetedMessage
|
|
842
|
+
{
|
|
843
|
+
switch (handlers.Count)
|
|
844
|
+
{
|
|
845
|
+
case <= 0:
|
|
846
|
+
{
|
|
847
|
+
return;
|
|
848
|
+
}
|
|
849
|
+
case 1:
|
|
850
|
+
{
|
|
851
|
+
MessageHandler handler = handlers.Keys.First();
|
|
852
|
+
handler.HandleTargeted(ref target, ref typedMessage, this, priority);
|
|
853
|
+
return;
|
|
854
|
+
}
|
|
855
|
+
default:
|
|
856
|
+
{
|
|
857
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
858
|
+
handlers.Keys
|
|
859
|
+
);
|
|
860
|
+
try
|
|
861
|
+
{
|
|
862
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
863
|
+
{
|
|
864
|
+
handler.HandleTargeted(ref target, ref typedMessage, this, priority);
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
finally
|
|
868
|
+
{
|
|
869
|
+
_messageHandlers.Push(messageHandlers);
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
break;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
|
|
708
877
|
public void UntypedSourcedBroadcast(InstanceId source, IBroadcastMessage typedMessage)
|
|
709
878
|
{
|
|
710
879
|
Type messageType = typedMessage.MessageType;
|
|
@@ -757,50 +926,40 @@
|
|
|
757
926
|
type,
|
|
758
927
|
out Dictionary<
|
|
759
928
|
InstanceId,
|
|
760
|
-
|
|
929
|
+
SortedList<int, Dictionary<MessageHandler, int>>
|
|
761
930
|
> broadcastHandlers
|
|
762
931
|
)
|
|
763
932
|
&& broadcastHandlers.TryGetValue(
|
|
764
933
|
source,
|
|
765
|
-
out
|
|
934
|
+
out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
|
|
766
935
|
)
|
|
767
936
|
&& 0 < sortedHandlers.Count
|
|
768
937
|
)
|
|
769
938
|
{
|
|
770
939
|
foundAnyHandlers = true;
|
|
771
|
-
|
|
772
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
773
|
-
try
|
|
940
|
+
if (sortedHandlers.Count == 1)
|
|
774
941
|
{
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
)
|
|
942
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
943
|
+
sortedHandlers.First();
|
|
944
|
+
RunBroadcast(ref source, ref typedMessage, entry.Key, entry.Value);
|
|
945
|
+
}
|
|
946
|
+
else
|
|
947
|
+
{
|
|
948
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
949
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
950
|
+
try
|
|
778
951
|
{
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
);
|
|
783
|
-
try
|
|
952
|
+
foreach (
|
|
953
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
954
|
+
)
|
|
784
955
|
{
|
|
785
|
-
|
|
786
|
-
{
|
|
787
|
-
handler.HandleSourcedBroadcast(
|
|
788
|
-
ref source,
|
|
789
|
-
ref typedMessage,
|
|
790
|
-
this,
|
|
791
|
-
priority
|
|
792
|
-
);
|
|
793
|
-
}
|
|
794
|
-
}
|
|
795
|
-
finally
|
|
796
|
-
{
|
|
797
|
-
_messageHandlers.Push(messageHandlers);
|
|
956
|
+
RunBroadcast(ref source, ref typedMessage, entry.Key, entry.Value);
|
|
798
957
|
}
|
|
799
958
|
}
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
959
|
+
finally
|
|
960
|
+
{
|
|
961
|
+
_sortedHandlers.Push(handlerList);
|
|
962
|
+
}
|
|
804
963
|
}
|
|
805
964
|
}
|
|
806
965
|
|
|
@@ -813,39 +972,39 @@
|
|
|
813
972
|
)
|
|
814
973
|
{
|
|
815
974
|
foundAnyHandlers = true;
|
|
816
|
-
|
|
817
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
818
|
-
try
|
|
975
|
+
if (sortedHandlers.Count == 1)
|
|
819
976
|
{
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
977
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
978
|
+
sortedHandlers.First();
|
|
979
|
+
RunBroadcastPostProcessing(
|
|
980
|
+
ref source,
|
|
981
|
+
ref typedMessage,
|
|
982
|
+
entry.Key,
|
|
983
|
+
entry.Value
|
|
984
|
+
);
|
|
985
|
+
}
|
|
986
|
+
else
|
|
987
|
+
{
|
|
988
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
989
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
990
|
+
try
|
|
823
991
|
{
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
);
|
|
828
|
-
try
|
|
829
|
-
{
|
|
830
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
831
|
-
{
|
|
832
|
-
handler.HandleSourcedBroadcastPostProcessing(
|
|
833
|
-
ref source,
|
|
834
|
-
ref typedMessage,
|
|
835
|
-
this,
|
|
836
|
-
priority
|
|
837
|
-
);
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
finally
|
|
992
|
+
foreach (
|
|
993
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
994
|
+
)
|
|
841
995
|
{
|
|
842
|
-
|
|
996
|
+
RunBroadcastPostProcessing(
|
|
997
|
+
ref source,
|
|
998
|
+
ref typedMessage,
|
|
999
|
+
entry.Key,
|
|
1000
|
+
entry.Value
|
|
1001
|
+
);
|
|
843
1002
|
}
|
|
844
1003
|
}
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
1004
|
+
finally
|
|
1005
|
+
{
|
|
1006
|
+
_sortedHandlers.Push(handlerList);
|
|
1007
|
+
}
|
|
849
1008
|
}
|
|
850
1009
|
}
|
|
851
1010
|
|
|
@@ -854,39 +1013,39 @@
|
|
|
854
1013
|
&& 0 < sortedHandlers.Count
|
|
855
1014
|
)
|
|
856
1015
|
{
|
|
857
|
-
|
|
858
|
-
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
859
|
-
try
|
|
1016
|
+
if (sortedHandlers.Count == 1)
|
|
860
1017
|
{
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
1018
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
|
|
1019
|
+
sortedHandlers.First();
|
|
1020
|
+
RunBroadcastWithoutSourcePostProcessing(
|
|
1021
|
+
ref source,
|
|
1022
|
+
ref typedMessage,
|
|
1023
|
+
entry.Key,
|
|
1024
|
+
entry.Value
|
|
1025
|
+
);
|
|
1026
|
+
}
|
|
1027
|
+
else
|
|
1028
|
+
{
|
|
1029
|
+
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
1030
|
+
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
1031
|
+
try
|
|
864
1032
|
{
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
);
|
|
869
|
-
try
|
|
870
|
-
{
|
|
871
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
872
|
-
{
|
|
873
|
-
handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
|
|
874
|
-
ref source,
|
|
875
|
-
ref typedMessage,
|
|
876
|
-
this,
|
|
877
|
-
priority
|
|
878
|
-
);
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
finally
|
|
1033
|
+
foreach (
|
|
1034
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
|
|
1035
|
+
)
|
|
882
1036
|
{
|
|
883
|
-
|
|
1037
|
+
RunBroadcastWithoutSourcePostProcessing(
|
|
1038
|
+
ref source,
|
|
1039
|
+
ref typedMessage,
|
|
1040
|
+
entry.Key,
|
|
1041
|
+
entry.Value
|
|
1042
|
+
);
|
|
884
1043
|
}
|
|
885
1044
|
}
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
1045
|
+
finally
|
|
1046
|
+
{
|
|
1047
|
+
_sortedHandlers.Push(handlerList);
|
|
1048
|
+
}
|
|
890
1049
|
}
|
|
891
1050
|
}
|
|
892
1051
|
|
|
@@ -901,45 +1060,226 @@
|
|
|
901
1060
|
}
|
|
902
1061
|
}
|
|
903
1062
|
|
|
904
|
-
private void
|
|
1063
|
+
private void RunBroadcastWithoutSourcePostProcessing<TMessage>(
|
|
1064
|
+
ref InstanceId source,
|
|
1065
|
+
ref TMessage typedMessage,
|
|
1066
|
+
int priority,
|
|
1067
|
+
Dictionary<MessageHandler, int> handlers
|
|
1068
|
+
)
|
|
1069
|
+
where TMessage : IBroadcastMessage
|
|
905
1070
|
{
|
|
906
|
-
|
|
907
|
-
{
|
|
908
|
-
return;
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
|
|
912
|
-
try
|
|
1071
|
+
switch (handlers.Count)
|
|
913
1072
|
{
|
|
914
|
-
|
|
1073
|
+
case <= 0:
|
|
915
1074
|
{
|
|
916
|
-
|
|
1075
|
+
return;
|
|
917
1076
|
}
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
1077
|
+
case 1:
|
|
1078
|
+
{
|
|
1079
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1080
|
+
handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
|
|
1081
|
+
ref source,
|
|
1082
|
+
ref typedMessage,
|
|
1083
|
+
this,
|
|
1084
|
+
priority
|
|
1085
|
+
);
|
|
1086
|
+
return;
|
|
1087
|
+
}
|
|
1088
|
+
default:
|
|
1089
|
+
{
|
|
1090
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1091
|
+
handlers.Keys
|
|
1092
|
+
);
|
|
1093
|
+
try
|
|
1094
|
+
{
|
|
1095
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1096
|
+
{
|
|
1097
|
+
handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
|
|
1098
|
+
ref source,
|
|
1099
|
+
ref typedMessage,
|
|
1100
|
+
this,
|
|
1101
|
+
priority
|
|
1102
|
+
);
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
finally
|
|
1106
|
+
{
|
|
1107
|
+
_messageHandlers.Push(messageHandlers);
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
break;
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
private void RunBroadcastPostProcessing<TMessage>(
|
|
1116
|
+
ref InstanceId source,
|
|
1117
|
+
ref TMessage typedMessage,
|
|
1118
|
+
int priority,
|
|
1119
|
+
Dictionary<MessageHandler, int> handlers
|
|
1120
|
+
)
|
|
1121
|
+
where TMessage : IBroadcastMessage
|
|
1122
|
+
{
|
|
1123
|
+
switch (handlers.Count)
|
|
928
1124
|
{
|
|
929
|
-
|
|
1125
|
+
case <= 0:
|
|
1126
|
+
{
|
|
1127
|
+
return;
|
|
1128
|
+
}
|
|
1129
|
+
case 1:
|
|
1130
|
+
{
|
|
1131
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1132
|
+
handler.HandleSourcedBroadcastPostProcessing(
|
|
1133
|
+
ref source,
|
|
1134
|
+
ref typedMessage,
|
|
1135
|
+
this,
|
|
1136
|
+
priority
|
|
1137
|
+
);
|
|
1138
|
+
return;
|
|
1139
|
+
}
|
|
1140
|
+
default:
|
|
1141
|
+
{
|
|
1142
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1143
|
+
handlers.Keys
|
|
1144
|
+
);
|
|
1145
|
+
try
|
|
1146
|
+
{
|
|
1147
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1148
|
+
{
|
|
1149
|
+
handler.HandleSourcedBroadcastPostProcessing(
|
|
1150
|
+
ref source,
|
|
1151
|
+
ref typedMessage,
|
|
1152
|
+
this,
|
|
1153
|
+
priority
|
|
1154
|
+
);
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
finally
|
|
1158
|
+
{
|
|
1159
|
+
_messageHandlers.Push(messageHandlers);
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
break;
|
|
1163
|
+
}
|
|
930
1164
|
}
|
|
1165
|
+
}
|
|
931
1166
|
|
|
932
|
-
|
|
933
|
-
|
|
1167
|
+
private void RunBroadcast<TMessage>(
|
|
1168
|
+
ref InstanceId source,
|
|
1169
|
+
ref TMessage typedMessage,
|
|
1170
|
+
int priority,
|
|
1171
|
+
Dictionary<MessageHandler, int> handlers
|
|
1172
|
+
)
|
|
1173
|
+
where TMessage : IBroadcastMessage
|
|
1174
|
+
{
|
|
1175
|
+
switch (handlers.Count)
|
|
934
1176
|
{
|
|
935
|
-
|
|
1177
|
+
case <= 0:
|
|
936
1178
|
{
|
|
937
|
-
|
|
1179
|
+
return;
|
|
1180
|
+
}
|
|
1181
|
+
case 1:
|
|
1182
|
+
{
|
|
1183
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1184
|
+
handler.HandleSourcedBroadcast(ref source, ref typedMessage, this, priority);
|
|
1185
|
+
return;
|
|
1186
|
+
}
|
|
1187
|
+
default:
|
|
1188
|
+
{
|
|
1189
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1190
|
+
handlers.Keys
|
|
1191
|
+
);
|
|
1192
|
+
try
|
|
1193
|
+
{
|
|
1194
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1195
|
+
{
|
|
1196
|
+
handler.HandleSourcedBroadcast(
|
|
1197
|
+
ref source,
|
|
1198
|
+
ref typedMessage,
|
|
1199
|
+
this,
|
|
1200
|
+
priority
|
|
1201
|
+
);
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
finally
|
|
1205
|
+
{
|
|
1206
|
+
_messageHandlers.Push(messageHandlers);
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
break;
|
|
938
1210
|
}
|
|
939
1211
|
}
|
|
940
|
-
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
private void BroadcastGlobalUntargeted(ref IUntargetedMessage message)
|
|
1215
|
+
{
|
|
1216
|
+
switch (_globalSinks.Count)
|
|
941
1217
|
{
|
|
942
|
-
|
|
1218
|
+
case <= 0:
|
|
1219
|
+
{
|
|
1220
|
+
return;
|
|
1221
|
+
}
|
|
1222
|
+
case 1:
|
|
1223
|
+
{
|
|
1224
|
+
MessageHandler handler = _globalSinks.Keys.First();
|
|
1225
|
+
handler.HandleGlobalUntargetedMessage(ref message, this);
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1228
|
+
default:
|
|
1229
|
+
{
|
|
1230
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1231
|
+
_globalSinks.Keys
|
|
1232
|
+
);
|
|
1233
|
+
try
|
|
1234
|
+
{
|
|
1235
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1236
|
+
{
|
|
1237
|
+
handler.HandleGlobalUntargetedMessage(ref message, this);
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
finally
|
|
1241
|
+
{
|
|
1242
|
+
_messageHandlers.Push(messageHandlers);
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
break;
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
private void BroadcastGlobalTargeted(ref InstanceId target, ref ITargetedMessage message)
|
|
1251
|
+
{
|
|
1252
|
+
switch (_globalSinks.Count)
|
|
1253
|
+
{
|
|
1254
|
+
case <= 0:
|
|
1255
|
+
{
|
|
1256
|
+
return;
|
|
1257
|
+
}
|
|
1258
|
+
case 1:
|
|
1259
|
+
{
|
|
1260
|
+
MessageHandler handler = _globalSinks.Keys.First();
|
|
1261
|
+
handler.HandleGlobalTargetedMessage(ref target, ref message, this);
|
|
1262
|
+
return;
|
|
1263
|
+
}
|
|
1264
|
+
default:
|
|
1265
|
+
{
|
|
1266
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1267
|
+
_globalSinks.Keys
|
|
1268
|
+
);
|
|
1269
|
+
try
|
|
1270
|
+
{
|
|
1271
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1272
|
+
{
|
|
1273
|
+
handler.HandleGlobalTargetedMessage(ref target, ref message, this);
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
finally
|
|
1277
|
+
{
|
|
1278
|
+
_messageHandlers.Push(messageHandlers);
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1281
|
+
break;
|
|
1282
|
+
}
|
|
943
1283
|
}
|
|
944
1284
|
}
|
|
945
1285
|
|
|
@@ -948,22 +1288,41 @@
|
|
|
948
1288
|
ref IBroadcastMessage message
|
|
949
1289
|
)
|
|
950
1290
|
{
|
|
951
|
-
|
|
1291
|
+
switch (_globalSinks.Count)
|
|
952
1292
|
{
|
|
953
|
-
|
|
954
|
-
}
|
|
955
|
-
|
|
956
|
-
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
|
|
957
|
-
try
|
|
958
|
-
{
|
|
959
|
-
foreach (MessageHandler handler in messageHandlers)
|
|
1293
|
+
case <= 0:
|
|
960
1294
|
{
|
|
1295
|
+
return;
|
|
1296
|
+
}
|
|
1297
|
+
case 1:
|
|
1298
|
+
{
|
|
1299
|
+
MessageHandler handler = _globalSinks.Keys.First();
|
|
961
1300
|
handler.HandleGlobalSourcedBroadcastMessage(ref source, ref message, this);
|
|
1301
|
+
return;
|
|
1302
|
+
}
|
|
1303
|
+
default:
|
|
1304
|
+
{
|
|
1305
|
+
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1306
|
+
_globalSinks.Keys
|
|
1307
|
+
);
|
|
1308
|
+
try
|
|
1309
|
+
{
|
|
1310
|
+
foreach (MessageHandler handler in messageHandlers)
|
|
1311
|
+
{
|
|
1312
|
+
handler.HandleGlobalSourcedBroadcastMessage(
|
|
1313
|
+
ref source,
|
|
1314
|
+
ref message,
|
|
1315
|
+
this
|
|
1316
|
+
);
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
finally
|
|
1320
|
+
{
|
|
1321
|
+
_messageHandlers.Push(messageHandlers);
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
break;
|
|
962
1325
|
}
|
|
963
|
-
}
|
|
964
|
-
finally
|
|
965
|
-
{
|
|
966
|
-
_messageHandlers.Push(messageHandlers);
|
|
967
1326
|
}
|
|
968
1327
|
}
|
|
969
1328
|
|
|
@@ -974,10 +1333,7 @@
|
|
|
974
1333
|
)
|
|
975
1334
|
{
|
|
976
1335
|
if (
|
|
977
|
-
!_interceptsByType.TryGetValue(
|
|
978
|
-
type,
|
|
979
|
-
out SortedDictionary<int, List<object>> interceptors
|
|
980
|
-
)
|
|
1336
|
+
!_interceptsByType.TryGetValue(type, out SortedList<int, List<object>> interceptors)
|
|
981
1337
|
|| interceptors.Count <= 0
|
|
982
1338
|
)
|
|
983
1339
|
{
|
|
@@ -1142,7 +1498,7 @@
|
|
|
1142
1498
|
if (
|
|
1143
1499
|
!_sinks.TryGetValue(
|
|
1144
1500
|
type,
|
|
1145
|
-
out
|
|
1501
|
+
out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
|
|
1146
1502
|
)
|
|
1147
1503
|
|| sortedHandlers.Count <= 0
|
|
1148
1504
|
)
|
|
@@ -1150,15 +1506,53 @@
|
|
|
1150
1506
|
return false;
|
|
1151
1507
|
}
|
|
1152
1508
|
|
|
1509
|
+
if (sortedHandlers.Count == 1)
|
|
1510
|
+
{
|
|
1511
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
|
|
1512
|
+
RunUntargetedBroadcast(ref message, entry.Key, entry.Value);
|
|
1513
|
+
return true;
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1153
1516
|
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
1154
1517
|
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
1155
1518
|
try
|
|
1156
1519
|
{
|
|
1157
|
-
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>>
|
|
1520
|
+
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
|
|
1521
|
+
{
|
|
1522
|
+
RunUntargetedBroadcast(ref message, entry.Key, entry.Value);
|
|
1523
|
+
}
|
|
1524
|
+
}
|
|
1525
|
+
finally
|
|
1526
|
+
{
|
|
1527
|
+
_sortedHandlers.Push(handlerList);
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
return true;
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
private void RunUntargetedBroadcast<TMessage>(
|
|
1534
|
+
ref TMessage message,
|
|
1535
|
+
int priority,
|
|
1536
|
+
Dictionary<MessageHandler, int> handlers
|
|
1537
|
+
)
|
|
1538
|
+
where TMessage : IMessage
|
|
1539
|
+
{
|
|
1540
|
+
switch (handlers.Count)
|
|
1541
|
+
{
|
|
1542
|
+
case <= 0:
|
|
1543
|
+
{
|
|
1544
|
+
return;
|
|
1545
|
+
}
|
|
1546
|
+
case 1:
|
|
1547
|
+
{
|
|
1548
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1549
|
+
handler.HandleUntargetedMessage(ref message, this, priority);
|
|
1550
|
+
return;
|
|
1551
|
+
}
|
|
1552
|
+
default:
|
|
1158
1553
|
{
|
|
1159
|
-
int priority = handlers.Key;
|
|
1160
1554
|
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1161
|
-
handlers.
|
|
1555
|
+
handlers.Keys
|
|
1162
1556
|
);
|
|
1163
1557
|
try
|
|
1164
1558
|
{
|
|
@@ -1171,14 +1565,10 @@
|
|
|
1171
1565
|
{
|
|
1172
1566
|
_messageHandlers.Push(messageHandlers);
|
|
1173
1567
|
}
|
|
1568
|
+
|
|
1569
|
+
break;
|
|
1174
1570
|
}
|
|
1175
1571
|
}
|
|
1176
|
-
finally
|
|
1177
|
-
{
|
|
1178
|
-
_sortedHandlers.Push(handlerList);
|
|
1179
|
-
}
|
|
1180
|
-
|
|
1181
|
-
return true;
|
|
1182
1572
|
}
|
|
1183
1573
|
|
|
1184
1574
|
private bool InternalTargetedWithoutTargetingBroadcast<TMessage>(
|
|
@@ -1191,7 +1581,7 @@
|
|
|
1191
1581
|
if (
|
|
1192
1582
|
!_sinks.TryGetValue(
|
|
1193
1583
|
type,
|
|
1194
|
-
out
|
|
1584
|
+
out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
|
|
1195
1585
|
)
|
|
1196
1586
|
|| sortedHandlers.Count <= 0
|
|
1197
1587
|
)
|
|
@@ -1199,15 +1589,54 @@
|
|
|
1199
1589
|
return false;
|
|
1200
1590
|
}
|
|
1201
1591
|
|
|
1592
|
+
if (sortedHandlers.Count == 1)
|
|
1593
|
+
{
|
|
1594
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
|
|
1595
|
+
RunTargetedWithoutTargeting(ref target, ref message, entry.Key, entry.Value);
|
|
1596
|
+
return true;
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1202
1599
|
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
1203
1600
|
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
1204
1601
|
try
|
|
1205
1602
|
{
|
|
1206
|
-
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>>
|
|
1603
|
+
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
|
|
1604
|
+
{
|
|
1605
|
+
RunTargetedWithoutTargeting(ref target, ref message, entry.Key, entry.Value);
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
finally
|
|
1609
|
+
{
|
|
1610
|
+
_sortedHandlers.Push(handlerList);
|
|
1611
|
+
}
|
|
1612
|
+
|
|
1613
|
+
return true;
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
private void RunTargetedWithoutTargeting<TMessage>(
|
|
1617
|
+
ref InstanceId target,
|
|
1618
|
+
ref TMessage message,
|
|
1619
|
+
int priority,
|
|
1620
|
+
Dictionary<MessageHandler, int> handlers
|
|
1621
|
+
)
|
|
1622
|
+
where TMessage : ITargetedMessage
|
|
1623
|
+
{
|
|
1624
|
+
switch (handlers.Count)
|
|
1625
|
+
{
|
|
1626
|
+
case <= 0:
|
|
1627
|
+
{
|
|
1628
|
+
return;
|
|
1629
|
+
}
|
|
1630
|
+
case 1:
|
|
1631
|
+
{
|
|
1632
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1633
|
+
handler.HandleTargetedWithoutTargeting(ref target, ref message, this, priority);
|
|
1634
|
+
return;
|
|
1635
|
+
}
|
|
1636
|
+
default:
|
|
1207
1637
|
{
|
|
1208
|
-
int priority = handlers.Key;
|
|
1209
1638
|
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1210
|
-
handlers.
|
|
1639
|
+
handlers.Keys
|
|
1211
1640
|
);
|
|
1212
1641
|
try
|
|
1213
1642
|
{
|
|
@@ -1225,18 +1654,14 @@
|
|
|
1225
1654
|
{
|
|
1226
1655
|
_messageHandlers.Push(messageHandlers);
|
|
1227
1656
|
}
|
|
1657
|
+
|
|
1658
|
+
break;
|
|
1228
1659
|
}
|
|
1229
1660
|
}
|
|
1230
|
-
finally
|
|
1231
|
-
{
|
|
1232
|
-
_sortedHandlers.Push(handlerList);
|
|
1233
|
-
}
|
|
1234
|
-
|
|
1235
|
-
return true;
|
|
1236
1661
|
}
|
|
1237
1662
|
|
|
1238
1663
|
private bool InternalBroadcastWithoutSource<TMessage>(
|
|
1239
|
-
ref InstanceId
|
|
1664
|
+
ref InstanceId source,
|
|
1240
1665
|
ref TMessage message,
|
|
1241
1666
|
Type type
|
|
1242
1667
|
)
|
|
@@ -1245,7 +1670,7 @@
|
|
|
1245
1670
|
if (
|
|
1246
1671
|
!_sinks.TryGetValue(
|
|
1247
1672
|
type,
|
|
1248
|
-
out
|
|
1673
|
+
out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
|
|
1249
1674
|
)
|
|
1250
1675
|
|| sortedHandlers.Count <= 0
|
|
1251
1676
|
)
|
|
@@ -1253,22 +1678,66 @@
|
|
|
1253
1678
|
return false;
|
|
1254
1679
|
}
|
|
1255
1680
|
|
|
1681
|
+
if (sortedHandlers.Count == 1)
|
|
1682
|
+
{
|
|
1683
|
+
KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
|
|
1684
|
+
RunBroadcastWithoutSource(ref source, ref message, entry.Key, entry.Value);
|
|
1685
|
+
return true;
|
|
1686
|
+
}
|
|
1687
|
+
|
|
1256
1688
|
List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
|
|
1257
1689
|
GetOrAddMessageHandlerStack(sortedHandlers);
|
|
1258
1690
|
try
|
|
1259
1691
|
{
|
|
1260
|
-
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>>
|
|
1692
|
+
foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
|
|
1693
|
+
{
|
|
1694
|
+
RunBroadcastWithoutSource(ref source, ref message, entry.Key, entry.Value);
|
|
1695
|
+
}
|
|
1696
|
+
}
|
|
1697
|
+
finally
|
|
1698
|
+
{
|
|
1699
|
+
_sortedHandlers.Push(handlerList);
|
|
1700
|
+
}
|
|
1701
|
+
|
|
1702
|
+
return true;
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
private void RunBroadcastWithoutSource<TMessage>(
|
|
1706
|
+
ref InstanceId source,
|
|
1707
|
+
ref TMessage message,
|
|
1708
|
+
int priority,
|
|
1709
|
+
Dictionary<MessageHandler, int> handlers
|
|
1710
|
+
)
|
|
1711
|
+
where TMessage : IBroadcastMessage
|
|
1712
|
+
{
|
|
1713
|
+
switch (handlers.Count)
|
|
1714
|
+
{
|
|
1715
|
+
case <= 0:
|
|
1716
|
+
{
|
|
1717
|
+
return;
|
|
1718
|
+
}
|
|
1719
|
+
case 1:
|
|
1720
|
+
{
|
|
1721
|
+
MessageHandler handler = handlers.Keys.First();
|
|
1722
|
+
handler.HandleSourcedBroadcastWithoutSource(
|
|
1723
|
+
ref source,
|
|
1724
|
+
ref message,
|
|
1725
|
+
this,
|
|
1726
|
+
priority
|
|
1727
|
+
);
|
|
1728
|
+
return;
|
|
1729
|
+
}
|
|
1730
|
+
default:
|
|
1261
1731
|
{
|
|
1262
|
-
int priority = handlers.Key;
|
|
1263
1732
|
List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
|
|
1264
|
-
handlers.
|
|
1733
|
+
handlers.Keys
|
|
1265
1734
|
);
|
|
1266
1735
|
try
|
|
1267
1736
|
{
|
|
1268
1737
|
foreach (MessageHandler handler in messageHandlers)
|
|
1269
1738
|
{
|
|
1270
1739
|
handler.HandleSourcedBroadcastWithoutSource(
|
|
1271
|
-
ref
|
|
1740
|
+
ref source,
|
|
1272
1741
|
ref message,
|
|
1273
1742
|
this,
|
|
1274
1743
|
priority
|
|
@@ -1279,19 +1748,15 @@
|
|
|
1279
1748
|
{
|
|
1280
1749
|
_messageHandlers.Push(messageHandlers);
|
|
1281
1750
|
}
|
|
1751
|
+
|
|
1752
|
+
break;
|
|
1282
1753
|
}
|
|
1283
1754
|
}
|
|
1284
|
-
finally
|
|
1285
|
-
{
|
|
1286
|
-
_sortedHandlers.Push(handlerList);
|
|
1287
|
-
}
|
|
1288
|
-
|
|
1289
|
-
return true;
|
|
1290
1755
|
}
|
|
1291
1756
|
|
|
1292
1757
|
private Action InternalRegisterUntargeted<T>(
|
|
1293
1758
|
MessageHandler messageHandler,
|
|
1294
|
-
Dictionary<Type,
|
|
1759
|
+
Dictionary<Type, SortedList<int, Dictionary<MessageHandler, int>>> sinks,
|
|
1295
1760
|
RegistrationMethod registrationMethod,
|
|
1296
1761
|
int priority
|
|
1297
1762
|
)
|
|
@@ -1308,11 +1773,11 @@
|
|
|
1308
1773
|
if (
|
|
1309
1774
|
!sinks.TryGetValue(
|
|
1310
1775
|
type,
|
|
1311
|
-
out
|
|
1776
|
+
out SortedList<int, Dictionary<MessageHandler, int>> handlers
|
|
1312
1777
|
)
|
|
1313
1778
|
)
|
|
1314
1779
|
{
|
|
1315
|
-
handlers = new
|
|
1780
|
+
handlers = new SortedList<int, Dictionary<MessageHandler, int>>();
|
|
1316
1781
|
sinks[type] = handlers;
|
|
1317
1782
|
}
|
|
1318
1783
|
|
|
@@ -1395,7 +1860,7 @@
|
|
|
1395
1860
|
MessageHandler messageHandler,
|
|
1396
1861
|
Dictionary<
|
|
1397
1862
|
Type,
|
|
1398
|
-
Dictionary<InstanceId,
|
|
1863
|
+
Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
|
|
1399
1864
|
> sinks,
|
|
1400
1865
|
RegistrationMethod registrationMethod,
|
|
1401
1866
|
int priority
|
|
@@ -1412,27 +1877,24 @@
|
|
|
1412
1877
|
type,
|
|
1413
1878
|
out Dictionary<
|
|
1414
1879
|
InstanceId,
|
|
1415
|
-
|
|
1880
|
+
SortedList<int, Dictionary<MessageHandler, int>>
|
|
1416
1881
|
> broadcastHandlers
|
|
1417
1882
|
)
|
|
1418
1883
|
)
|
|
1419
1884
|
{
|
|
1420
1885
|
broadcastHandlers =
|
|
1421
|
-
new Dictionary<
|
|
1422
|
-
InstanceId,
|
|
1423
|
-
SortedDictionary<int, Dictionary<MessageHandler, int>>
|
|
1424
|
-
>();
|
|
1886
|
+
new Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>();
|
|
1425
1887
|
sinks[type] = broadcastHandlers;
|
|
1426
1888
|
}
|
|
1427
1889
|
|
|
1428
1890
|
if (
|
|
1429
1891
|
!broadcastHandlers.TryGetValue(
|
|
1430
1892
|
context,
|
|
1431
|
-
out
|
|
1893
|
+
out SortedList<int, Dictionary<MessageHandler, int>> handlers
|
|
1432
1894
|
)
|
|
1433
1895
|
)
|
|
1434
1896
|
{
|
|
1435
|
-
handlers = new
|
|
1897
|
+
handlers = new SortedList<int, Dictionary<MessageHandler, int>>();
|
|
1436
1898
|
broadcastHandlers[context] = handlers;
|
|
1437
1899
|
}
|
|
1438
1900
|
|