Merge pull request #2962 from marek-safar/referencesource-submodule-move
[mono.git] / mcs / class / referencesource / System.Activities.Presentation / System.Activities.Presentation / System / Activities / Presentation / SQM / ActivityUsageCounter.cs
1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //----------------------------------------------------------------
4
5 namespace System.Activities.Presentation.Sqm
6 {
7     using System.Collections.Generic;
8     using System.Diagnostics.CodeAnalysis;
9     using System.Runtime;
10
11     enum ActivityTypeId
12     {
13         // Unknown represents all custom activities
14         Unknown = 0,
15         // Out of box activities for .NET 4.0
16         DoWhile = 1,
17         ForEach = 2,
18         If = 3,
19         Parallel = 4,
20         ParallelForEach = 5,
21         Pick = 6,
22         PickBranch = 7,
23         Sequence = 8,
24         Switch = 9,
25         While = 10,
26         Flowchart = 11,
27         FlowDecision = 12,
28         FlowSwitch = 13,
29         CorrelationScope = 14,
30         InitializeCorrelation = 15,
31         Receive = 16,
32         ReceiveAndSendReply = 17,
33         Send = 18,
34         SendAndReceiveReply = 19,
35         TransactedReceiveScope = 20,
36         Persist = 21,
37         TerminateWorkflow = 22,
38         Assign = 23,
39         Delay = 24,
40         InvokeMethod = 25,
41         WriteLine = 26,
42         CancellationScope = 27,
43         CompensableActivity = 28,
44         Compensate = 29,
45         Confirm = 30,
46         TransactionScope = 31,
47         AddToCollection = 32,
48         ClearCollection = 33,
49         ExistsInCollection = 34,
50         RemoveFromCollection = 35,
51         Throw = 36,
52         TryCatch = 37,
53         Rethrow = 38,
54         Interop = 39,
55
56         // To be added: Out of box activities introduced in .NET 4.5
57         StateMachine = 40,
58         State = 41,
59         FinalState = 42,
60         NoPersistScope = 44,
61         InvokeDelegate = 49,
62     };
63
64     static class ActivityUsageCounter
65     {
66         static Dictionary<string, ActivityTypeId> mapping = new Dictionary<string, ActivityTypeId>();
67
68         [SuppressMessage(FxCop.Category.Performance, FxCop.Rule.InitializeReferenceTypeStaticFieldsInline, Justification = "Dictionary items Cannot be initialized inline.")]
69         static ActivityUsageCounter()
70         {
71             // For non-generic activity, use FullName as the key.
72             // For generic activity, use Name only since the combination of FullName is open ended.
73             mapping["System.Activities.Statements.DoWhile"] = ActivityTypeId.DoWhile;
74             mapping["ForEachWithBodyFactory`1"] = ActivityTypeId.ForEach;
75             mapping["System.Activities.Statements.If"] = ActivityTypeId.If;
76             mapping["System.Activities.Statements.Parallel"] = ActivityTypeId.Parallel;
77             mapping["ParallelForEachWithBodyFactory`1"] = ActivityTypeId.ParallelForEach;
78             mapping["System.Activities.Core.Presentation.Factories.PickWithTwoBranchesFactory"] = ActivityTypeId.Pick;
79             mapping["System.Activities.Statements.PickBranch"] = ActivityTypeId.PickBranch;
80             mapping["System.Activities.Statements.Sequence"] = ActivityTypeId.Sequence;
81             mapping["Switch`1"] = ActivityTypeId.Switch;
82             mapping["System.Activities.Statements.While"] = ActivityTypeId.While;
83             mapping["System.Activities.Statements.Flowchart"] = ActivityTypeId.Flowchart;
84             mapping["System.Activities.Statements.FlowDecision"] = ActivityTypeId.FlowDecision;
85             mapping["FlowSwitch`1"] = ActivityTypeId.FlowSwitch;
86             mapping["System.ServiceModel.Activities.CorrelationScope"] = ActivityTypeId.CorrelationScope;
87             mapping["System.ServiceModel.Activities.InitializeCorrelation"] = ActivityTypeId.InitializeCorrelation;
88             mapping["System.ServiceModel.Activities.Receive"] = ActivityTypeId.Receive;
89             mapping["System.ServiceModel.Activities.Presentation.Factories.ReceiveAndSendReplyFactory"] = ActivityTypeId.ReceiveAndSendReply;
90             mapping["System.ServiceModel.Activities.Send"] = ActivityTypeId.Send;
91             mapping["System.ServiceModel.Activities.Presentation.Factories.SendAndReceiveReplyFactory"] = ActivityTypeId.SendAndReceiveReply;
92             mapping["System.ServiceModel.Activities.TransactedReceiveScope"] = ActivityTypeId.TransactedReceiveScope;
93             mapping["System.Activities.Statements.Persist"] = ActivityTypeId.Persist;
94             mapping["System.Activities.Statements.TerminateWorkflow"] = ActivityTypeId.TerminateWorkflow;
95             mapping["System.Activities.Statements.Assign"] = ActivityTypeId.Assign;
96             mapping["System.Activities.Statements.Delay"] = ActivityTypeId.Delay;
97             mapping["System.Activities.Statements.InvokeMethod"] = ActivityTypeId.InvokeMethod;
98             mapping["System.Activities.Statements.WriteLine"] = ActivityTypeId.WriteLine;
99             mapping["System.Activities.Statements.CancellationScope"] = ActivityTypeId.CancellationScope;
100             mapping["System.Activities.Statements.CompensableActivity"] = ActivityTypeId.CompensableActivity;
101             mapping["System.Activities.Statements.Compensate"] = ActivityTypeId.Compensate;
102             mapping["System.Activities.Statements.Confirm"] = ActivityTypeId.Confirm;
103             mapping["System.Activities.Statements.TransactionScope"] = ActivityTypeId.TransactionScope;
104             mapping["AddToCollection`1"] = ActivityTypeId.AddToCollection;
105             mapping["ClearCollection`1"] = ActivityTypeId.ClearCollection;
106             mapping["ExistsInCollection`1"] = ActivityTypeId.ExistsInCollection;
107             mapping["RemoveFromCollection`1"] = ActivityTypeId.RemoveFromCollection;
108             mapping["System.Activities.Statements.Rethrow"] = ActivityTypeId.Rethrow;
109             mapping["System.Activities.Statements.Throw"] = ActivityTypeId.Throw;
110             mapping["System.Activities.Statements.TryCatch"] = ActivityTypeId.TryCatch;
111             mapping["System.Activities.Statements.Interop"] = ActivityTypeId.Interop;
112             mapping["System.Activities.Core.Presentation.Factories.StateMachineWithInitialStateFactory"] = ActivityTypeId.StateMachine;
113             mapping["System.Activities.Statements.State"] = ActivityTypeId.State;
114             mapping["System.Activities.Core.Presentation.FinalState"] = ActivityTypeId.FinalState;
115             mapping["System.Activities.Statements.NoPersistScope"] = ActivityTypeId.NoPersistScope;
116             mapping["System.Activities.Statements.InvokeDelegate"] = ActivityTypeId.InvokeDelegate;
117         }
118
119         static internal ActivityTypeId MapTypeToId(Type activityType)
120         {
121             ActivityTypeId typeId = ActivityTypeId.Unknown;
122             if (activityType != null)
123             {
124                 string typeName = activityType.IsGenericType ? activityType.Name : activityType.FullName;
125                 if (mapping.ContainsKey(typeName))
126                 {
127                     typeId = mapping[typeName];
128                 }
129             }
130             return typeId;
131         }
132
133         static internal void ReportUsage(IVSSqmService sqmService, Type activityType)
134         {
135             if (sqmService != null)
136             {
137                 uint[] data = new uint[1];
138                 data[0] = (uint)MapTypeToId(activityType);
139                 sqmService.AddArrayToStream((int)DataPointIds.ActivityUsageCount, data, data.Length);
140             }
141         }
142     }
143 }