1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //----------------------------------------------------------------
5 namespace System.Activities.Presentation.Sqm
7 using System.Collections.Generic;
8 using System.Diagnostics.CodeAnalysis;
13 // Unknown represents all custom activities
15 // Out of box activities for .NET 4.0
29 CorrelationScope = 14,
30 InitializeCorrelation = 15,
32 ReceiveAndSendReply = 17,
34 SendAndReceiveReply = 19,
35 TransactedReceiveScope = 20,
37 TerminateWorkflow = 22,
42 CancellationScope = 27,
43 CompensableActivity = 28,
46 TransactionScope = 31,
49 ExistsInCollection = 34,
50 RemoveFromCollection = 35,
56 // To be added: Out of box activities introduced in .NET 4.5
64 static class ActivityUsageCounter
66 static Dictionary<string, ActivityTypeId> mapping = new Dictionary<string, ActivityTypeId>();
68 [SuppressMessage(FxCop.Category.Performance, FxCop.Rule.InitializeReferenceTypeStaticFieldsInline, Justification = "Dictionary items Cannot be initialized inline.")]
69 static ActivityUsageCounter()
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;
119 static internal ActivityTypeId MapTypeToId(Type activityType)
121 ActivityTypeId typeId = ActivityTypeId.Unknown;
122 if (activityType != null)
124 string typeName = activityType.IsGenericType ? activityType.Name : activityType.FullName;
125 if (mapping.ContainsKey(typeName))
127 typeId = mapping[typeName];
133 static internal void ReportUsage(IVSSqmService sqmService, Type activityType)
135 if (sqmService != null)
137 uint[] data = new uint[1];
138 data[0] = (uint)MapTypeToId(activityType);
139 sqmService.AddArrayToStream((int)DataPointIds.ActivityUsageCount, data, data.Length);