blob: d8a0c0a14b1e41316bdab53bf6d6d13b939a2eb3 [file] [log] [blame]
csharptest2b868842011-06-10 14:41:47 -05001using System;
2using System.Collections;
3using System.Globalization;
4using Google.ProtocolBuffers.Descriptors;
5
6//Disable CS3011: only CLS-compliant members can be abstract
7#pragma warning disable 3011
8
9namespace Google.ProtocolBuffers.Serialization
10{
11 /// <summary>
12 /// Provides a base class for writers that performs some basic type dispatching
13 /// </summary>
14 public abstract class AbstractWriter : ICodedOutputStream, IDisposable
15 {
16 /// <summary>
17 /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
18 /// </summary>
19 public void Dispose()
20 {
21 GC.SuppressFinalize(this);
22 Flush();
23 Dispose(true);
24 }
25
26 /// <summary>
27 /// Completes any pending write operations
28 /// </summary>
29 public virtual void Flush()
30 { }
31
32 /// <summary>
33 /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
34 /// </summary>
35 protected virtual void Dispose(bool disposing)
36 {
37 }
38
39 /// <summary>
40 /// Writes the message to the the formatted stream.
41 /// </summary>
42 public abstract void WriteMessage(IMessageLite message);
43
44 /// <summary>
45 /// Writes a message
46 /// </summary>
47 public abstract void WriteMessage(string field, IMessageLite message);
48
49
50
51 /// <summary>
52 /// Writes a Boolean value
53 /// </summary>
54 protected abstract void Write(string field, Boolean value);
55
56 /// <summary>
57 /// Writes a Int32 value
58 /// </summary>
59 protected abstract void Write(string field, Int32 value);
60
61 /// <summary>
62 /// Writes a UInt32 value
63 /// </summary>
64 [CLSCompliant(false)]
65 protected abstract void Write(string field, UInt32 value);
66
67 /// <summary>
68 /// Writes a Int64 value
69 /// </summary>
70 protected abstract void Write(string field, Int64 value);
71
72 /// <summary>
73 /// Writes a UInt64 value
74 /// </summary>
75 [CLSCompliant(false)]
76 protected abstract void Write(string field, UInt64 value);
77
78 /// <summary>
79 /// Writes a Single value
80 /// </summary>
81 protected abstract void Write(string field, Single value);
82
83 /// <summary>
84 /// Writes a Double value
85 /// </summary>
86 protected abstract void Write(string field, Double value);
87
88 /// <summary>
89 /// Writes a String value
90 /// </summary>
91 protected abstract void Write(string field, String value);
92
93 /// <summary>
94 /// Writes a set of bytes
95 /// </summary>
96 protected abstract void Write(string field, ByteString value);
97
98 /// <summary>
99 /// Writes a message or group as a field
100 /// </summary>
101 protected abstract void WriteMessageOrGroup(string field, IMessageLite message);
102
103 /// <summary>
104 /// Writes a System.Enum by the numeric and textual value
105 /// </summary>
106 protected abstract void WriteEnum(string field, int number, string name);
107
108 /// <summary>
109 /// Writes a field of the type determined by field.FieldType
110 /// </summary>
111 protected virtual void WriteField(FieldType fieldType, string field, object value)
112 {
113 switch (fieldType)
114 {
115 case FieldType.Bool: Write(field, (bool)value); break;
116 case FieldType.Int64:
117 case FieldType.SInt64:
118 case FieldType.SFixed64: Write(field, (long)value); break;
119 case FieldType.UInt64:
120 case FieldType.Fixed64: Write(field, (ulong)value); break;
121 case FieldType.Int32:
122 case FieldType.SInt32:
123 case FieldType.SFixed32: Write(field, (int)value); break;
124 case FieldType.UInt32:
125 case FieldType.Fixed32: Write(field, (uint)value); break;
126 case FieldType.Float: Write(field, (float)value); break;
127 case FieldType.Double: Write(field, (double)value); break;
128 case FieldType.String: Write(field, (string)value); break;
129 case FieldType.Bytes: Write(field, (ByteString)value); break;
130 case FieldType.Group: WriteMessageOrGroup(field, (IMessageLite)value); break;
131 case FieldType.Message: WriteMessageOrGroup(field, (IMessageLite)value); break;
132 case FieldType.Enum:
133 {
134 if (value is IEnumLite) WriteEnum(field, ((IEnumLite)value).Number, ((IEnumLite)value).Name);
135 else if (value is IConvertible) WriteEnum(field, ((IConvertible)value).ToInt32(CultureInfo.InvariantCulture), ((IConvertible)value).ToString(CultureInfo.InvariantCulture));
136 else throw new ArgumentException("Expected an Enum type for field " + field);
137 break;
138 }
139 default:
140 throw InvalidProtocolBufferException.InvalidTag();
141 }
142 }
143
144 /// <summary>
145 /// Writes an array of field values
146 /// </summary>
147 protected virtual void WriteArray(FieldType fieldType, string field, IEnumerable items)
148 {
149 foreach (object obj in items)
150 WriteField(fieldType, field, obj);
151 }
152
153 /// <summary>
154 /// Writes a numeric unknown field of wire type: Fixed32, Fixed64, or Variant
155 /// </summary>
156 [CLSCompliant(false)]
157 protected virtual void WriteUnknown(WireFormat.WireType wireType, int fieldNumber, ulong value)
158 { }
159
160 /// <summary>
161 /// Writes an unknown field, Expect WireType of GroupStart or LengthPrefix
162 /// </summary>
163 [CLSCompliant(false)]
164 protected virtual void WriteUnknown(WireFormat.WireType wireType, int fieldNumber, ByteString value)
165 { }
166
167 #region ICodedOutputStream Members
168
169 void ICodedOutputStream.WriteUnknownGroup(int fieldNumber, IMessageLite value)
170 { }
171 void ICodedOutputStream.WriteUnknownBytes(int fieldNumber, ByteString value)
172 { }
173 void ICodedOutputStream.WriteUnknownField(int fieldNumber, WireFormat.WireType type, ulong value)
174 { }
175
176 void ICodedOutputStream.WriteMessageSetExtension(int fieldNumber, string fieldName, IMessageLite value)
177 { }
178
179 void ICodedOutputStream.WriteMessageSetExtension(int fieldNumber, string fieldName, ByteString value)
180 { }
181
182 void ICodedOutputStream.WriteField(FieldType fieldType, int fieldNumber, string fieldName, object value)
183 { WriteField(fieldType, fieldName, value); }
184
185 void ICodedOutputStream.WriteDouble(int fieldNumber, string fieldName, double value)
186 { Write(fieldName, value); }
187
188 void ICodedOutputStream.WriteFloat(int fieldNumber, string fieldName, float value)
189 { Write(fieldName, value); }
190
191 void ICodedOutputStream.WriteUInt64(int fieldNumber, string fieldName, ulong value)
192 { Write(fieldName, value); }
193
194 void ICodedOutputStream.WriteInt64(int fieldNumber, string fieldName, long value)
195 { Write(fieldName, value); }
196
197 void ICodedOutputStream.WriteInt32(int fieldNumber, string fieldName, int value)
198 { Write(fieldName, value); }
199
200 void ICodedOutputStream.WriteFixed64(int fieldNumber, string fieldName, ulong value)
201 { Write(fieldName, value); }
202
203 void ICodedOutputStream.WriteFixed32(int fieldNumber, string fieldName, uint value)
204 { Write(fieldName, value); }
205
206 void ICodedOutputStream.WriteBool(int fieldNumber, string fieldName, bool value)
207 { Write(fieldName, value); }
208
209 void ICodedOutputStream.WriteString(int fieldNumber, string fieldName, string value)
210 { Write(fieldName, value); }
211
212 void ICodedOutputStream.WriteGroup(int fieldNumber, string fieldName, IMessageLite value)
213 { WriteMessageOrGroup(fieldName, value); }
214
215 void ICodedOutputStream.WriteMessage(int fieldNumber, string fieldName, IMessageLite value)
216 { WriteMessageOrGroup(fieldName, value); }
217
218 void ICodedOutputStream.WriteBytes(int fieldNumber, string fieldName, ByteString value)
219 { Write(fieldName, value); }
220
221 void ICodedOutputStream.WriteUInt32(int fieldNumber, string fieldName, uint value)
222 { Write(fieldName, value); }
223
224 void ICodedOutputStream.WriteEnum(int fieldNumber, string fieldName, int value, object rawValue)
225 { WriteEnum(fieldName, value, rawValue.ToString()); }
226
227 void ICodedOutputStream.WriteSFixed32(int fieldNumber, string fieldName, int value)
228 { Write(fieldName, value); }
229
230 void ICodedOutputStream.WriteSFixed64(int fieldNumber, string fieldName, long value)
231 { Write(fieldName, value); }
232
233 void ICodedOutputStream.WriteSInt32(int fieldNumber, string fieldName, int value)
234 { Write(fieldName, value); }
235
236 void ICodedOutputStream.WriteSInt64(int fieldNumber, string fieldName, long value)
237 { Write(fieldName, value); }
238
239
240 void ICodedOutputStream.WriteArray(FieldType fieldType, int fieldNumber, string fieldName, IEnumerable list)
241 { WriteArray(fieldType, fieldName, list); }
242
243 void ICodedOutputStream.WriteGroupArray<T>(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<T> list)
244 { WriteArray(FieldType.Group, fieldName, list); }
245
246 void ICodedOutputStream.WriteMessageArray<T>(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<T> list)
247 { WriteArray(FieldType.Message, fieldName, list); }
248
249 void ICodedOutputStream.WriteStringArray(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<string> list)
250 { WriteArray(FieldType.String, fieldName, list); }
251
252 void ICodedOutputStream.WriteBytesArray(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<ByteString> list)
253 { WriteArray(FieldType.Bytes, fieldName, list); }
254
255 void ICodedOutputStream.WriteBoolArray(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<bool> list)
256 { WriteArray(FieldType.Bool, fieldName, list); }
257
258 void ICodedOutputStream.WriteInt32Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<int> list)
259 { WriteArray(FieldType.Int32, fieldName, list); }
260
261 void ICodedOutputStream.WriteSInt32Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<int> list)
262 { WriteArray(FieldType.SInt32, fieldName, list); }
263
264 void ICodedOutputStream.WriteUInt32Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<uint> list)
265 { WriteArray(FieldType.UInt32, fieldName, list); }
266
267 void ICodedOutputStream.WriteFixed32Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<uint> list)
268 { WriteArray(FieldType.Fixed32, fieldName, list); }
269
270 void ICodedOutputStream.WriteSFixed32Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<int> list)
271 { WriteArray(FieldType.SFixed32, fieldName, list); }
272
273 void ICodedOutputStream.WriteInt64Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<long> list)
274 { WriteArray(FieldType.Int64, fieldName, list); }
275
276 void ICodedOutputStream.WriteSInt64Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<long> list)
277 { WriteArray(FieldType.SInt64, fieldName, list); }
278
279 void ICodedOutputStream.WriteUInt64Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<ulong> list)
280 { WriteArray(FieldType.UInt64, fieldName, list); }
281
282 void ICodedOutputStream.WriteFixed64Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<ulong> list)
283 { WriteArray(FieldType.Fixed64, fieldName, list); }
284
285 void ICodedOutputStream.WriteSFixed64Array(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<long> list)
286 { WriteArray(FieldType.SFixed64, fieldName, list); }
287
288 void ICodedOutputStream.WriteDoubleArray(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<double> list)
289 { WriteArray(FieldType.Double, fieldName, list); }
290
291 void ICodedOutputStream.WriteFloatArray(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<float> list)
292 { WriteArray(FieldType.Float, fieldName, list); }
293
294 void ICodedOutputStream.WriteEnumArray<T>(int fieldNumber, string fieldName, System.Collections.Generic.IEnumerable<T> list)
295 { WriteArray(FieldType.Enum, fieldName, list); }
296
297 void ICodedOutputStream.WritePackedArray(FieldType fieldType, int fieldNumber, string fieldName, IEnumerable list)
298 { WriteArray(fieldType, fieldName, list); }
299
300
301 void ICodedOutputStream.WritePackedBoolArray(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<bool> list)
302 { WriteArray(FieldType.Bool, fieldName, list); }
303
304 void ICodedOutputStream.WritePackedInt32Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<int> list)
305 { WriteArray(FieldType.Int32, fieldName, list); }
306
307 void ICodedOutputStream.WritePackedSInt32Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<int> list)
308 { WriteArray(FieldType.SInt32, fieldName, list); }
309
310 void ICodedOutputStream.WritePackedUInt32Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<uint> list)
311 { WriteArray(FieldType.UInt32, fieldName, list); }
312
313 void ICodedOutputStream.WritePackedFixed32Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<uint> list)
314 { WriteArray(FieldType.Fixed32, fieldName, list); }
315
316 void ICodedOutputStream.WritePackedSFixed32Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<int> list)
317 { WriteArray(FieldType.SFixed32, fieldName, list); }
318
319 void ICodedOutputStream.WritePackedInt64Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<long> list)
320 { WriteArray(FieldType.Int64, fieldName, list); }
321
322 void ICodedOutputStream.WritePackedSInt64Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<long> list)
323 { WriteArray(FieldType.SInt64, fieldName, list); }
324
325 void ICodedOutputStream.WritePackedUInt64Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<ulong> list)
326 { WriteArray(FieldType.UInt64, fieldName, list); }
327
328 void ICodedOutputStream.WritePackedFixed64Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<ulong> list)
329 { WriteArray(FieldType.Fixed64, fieldName, list); }
330
331 void ICodedOutputStream.WritePackedSFixed64Array(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<long> list)
332 { WriteArray(FieldType.SFixed64, fieldName, list); }
333
334 void ICodedOutputStream.WritePackedDoubleArray(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<double> list)
335 { WriteArray(FieldType.Double, fieldName, list); }
336
337 void ICodedOutputStream.WritePackedFloatArray(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<float> list)
338 { WriteArray(FieldType.Float, fieldName, list); }
339
340 void ICodedOutputStream.WritePackedEnumArray<T>(int fieldNumber, string fieldName, int computedSize, System.Collections.Generic.IEnumerable<T> list)
341 { WriteArray(FieldType.Enum, fieldName, list); }
342
343 #endregion
344 }
345}