File: MethodParametersDictionary.cs

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (215 lines) | stat: -rw-r--r-- 7,353 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
namespace System.Web.UI.WebControls {
    
    using System.Collections;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;

    internal sealed class MethodParametersDictionary : IDictionary<string, MethodParameterValue>, IStateManager {

        private bool _tracking;
        private EventHandler _parametersChangedHandler;
        private Dictionary<string, MethodParameterValue> _innerDictionary;

        /// <devdoc>
        /// Used by Parameters to raise the ParametersChanged event.
        /// </devdoc>
        internal void CallOnParametersChanged() {
            OnParametersChanged(EventArgs.Empty);
        }

        /// <devdoc>
        /// Raises the ParametersChanged event.
        /// </devdoc>
        private void OnParametersChanged(EventArgs e) {
            if (_parametersChangedHandler != null) {
                _parametersChangedHandler(this, e);
            }
        }

        /// <devdoc>
        /// Occurs when any of the Parameter Values in the dictionary change.
        /// </devdoc>
        public event EventHandler ParametersChanged {
            add {
                _parametersChangedHandler = (EventHandler)Delegate.Combine(_parametersChangedHandler, value);
            }
            remove {
                _parametersChangedHandler = (EventHandler)Delegate.Remove(_parametersChangedHandler, value);
            }
        }

        public int Count {
            get {
                return InnerDictionary.Count;
            }
        }

        private void LoadViewState(object savedState) {
            if (savedState != null) {
                Debug.Assert(savedState is Pair);
                Pair pair = (Pair)savedState;

                string[] names = (string[])pair.First;
                object[] states = (object[])pair.Second;

                for (int i = 0; i < names.Length; i++) {
                    string key = names[i];
                    Debug.Assert(!InnerDictionary.ContainsKey(key), "The collection was not empty when loading the viewstate");
                    MethodParameterValue parameter = new MethodParameterValue();
                    Add(key, parameter);
                    ((IStateManager)parameter).LoadViewState(states[i]);
                }
            }
        }

        private object SaveViewState() {
            bool hasState = false;
            int count = Count;
            string[] names = new string[count];
            object[] states = new object[count];

            int i = 0;
            foreach (KeyValuePair<string, MethodParameterValue> kvp in InnerDictionary) {
                names[i] = kvp.Key;
                states[i] = ((IStateManager)kvp.Value).SaveViewState();
                if (states[i] != null)
                    hasState = true;
                i++;
            }

            return hasState ? new Pair(names, states) : null;
        }

        private void TrackViewState() {
            _tracking = true;
            foreach (MethodParameterValue parameter in InnerDictionary.Values) {
                ((IStateManager)parameter).TrackViewState();
            }
        }

        private Dictionary<string, MethodParameterValue> InnerDictionary {
            get {
                if (_innerDictionary == null) {
                    _innerDictionary = new Dictionary<string, MethodParameterValue>();
                }
                return _innerDictionary;
            }
        }

        #region IDictionary<KeyValuePair<string,MethodParameter>> Members
        public ICollection<string> Keys {
            get {
                return InnerDictionary.Keys;
            }
        }

        public ICollection<MethodParameterValue> Values {
            get {
                return InnerDictionary.Values;
            }
        }

        public MethodParameterValue this[string key] {
            get {
                return InnerDictionary[key];
            }
            set {
                InnerDictionary[key] = value;
                if (value != null) {
                    value.SetOwner(this);
                }
            }
        }

        public void Add(string key, MethodParameterValue value) {
            InnerDictionary.Add(key, value);
            if (value != null) {
                value.SetOwner(this);
                if (_tracking) {
                    ((IStateManager)value).TrackViewState();
                }
            }
        }

        public bool ContainsKey(string key) {
            return InnerDictionary.ContainsKey(key);
        }

        public bool Remove(string key) {
            if (InnerDictionary.ContainsKey(key)) {
                MethodParameterValue value = InnerDictionary[key];
                if (value != null) {
                    value.SetOwner(null);
                }
            }
            return InnerDictionary.Remove(key);
        }

        public bool TryGetValue(string key, out MethodParameterValue value) {
            return InnerDictionary.TryGetValue(key, out value);
        }
        #endregion

        #region ICollection<KeyValuePair<string,MethodParameter>> Members
        void ICollection<KeyValuePair<string, MethodParameterValue>>.Clear() {
            InnerDictionary.Clear();
        }

        bool ICollection<KeyValuePair<string, MethodParameterValue>>.IsReadOnly {
            get {
                return ((ICollection<KeyValuePair<string, MethodParameterValue>>)InnerDictionary).IsReadOnly;
            }
        }

        void ICollection<KeyValuePair<string, MethodParameterValue>>.Add(KeyValuePair<string, MethodParameterValue> item) {
            Add(item.Key, item.Value);
        }

        bool ICollection<KeyValuePair<string, MethodParameterValue>>.Contains(KeyValuePair<string, MethodParameterValue> item) {
            return ((ICollection<KeyValuePair<string, MethodParameterValue>>)InnerDictionary).Contains(item);
        }

        void ICollection<KeyValuePair<string, MethodParameterValue>>.CopyTo(KeyValuePair<string, MethodParameterValue>[] array, int arrayIndex) {
            ((ICollection<KeyValuePair<string, MethodParameterValue>>)InnerDictionary).CopyTo(array, arrayIndex);
        }

        bool ICollection<KeyValuePair<string, MethodParameterValue>>.Remove(KeyValuePair<string, MethodParameterValue> item) {
            return ((ICollection<KeyValuePair<string, MethodParameterValue>>)InnerDictionary).Remove(item);
        }
        #endregion

        #region IEnumerable<KeyValuePair<string,MethodParameter>> Members
        public IEnumerator<KeyValuePair<string, MethodParameterValue>> GetEnumerator() {
            return InnerDictionary.GetEnumerator();
        }
        #endregion

        #region IEnumerable Members
        IEnumerator IEnumerable.GetEnumerator() {
            return GetEnumerator();
        }
        #endregion

        #region Implementation of IStateManager

        bool IStateManager.IsTrackingViewState {
            get {
                return _tracking;
            }
        }

        void IStateManager.LoadViewState(object savedState) {
            LoadViewState(savedState);
        }

        object IStateManager.SaveViewState() {
            return SaveViewState();
        }

        void IStateManager.TrackViewState() {
            TrackViewState();
        }
        #endregion
    }
}