Support Compact Framework 3.5

pull/288/head
Jon Skeet 15 years ago
parent 0aac0e4fe3
commit b49d3c7834
  1. 2
      src/ProtocolBuffers/CodedInputStream.cs
  2. 4
      src/ProtocolBuffers/CodedOutputStream.cs
  3. 9
      src/ProtocolBuffers/FieldAccess/ReflectionUtil.cs
  4. 2
      src/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs
  5. 12
      src/ProtocolBuffers/FieldAccess/RepeatedPrimitiveAccessor.cs
  6. 2
      src/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs
  7. 8
      src/ProtocolBuffers/FieldAccess/SinglePrimitiveAccessor.cs
  8. 6
      src/ProtocolBuffers/FieldSet.cs
  9. 4
      src/ProtocolBuffers/GeneratedMessage.cs
  10. 7
      src/ProtocolBuffers/MessageStreamIterator.cs
  11. 2
      src/ProtocolBuffers/Properties/AssemblyInfo.cs
  12. 2
      src/ProtocolBuffers/ProtocolBuffers.csproj
  13. 143
      src/ProtocolBuffers/ProtocolBuffersCF.csproj
  14. 2
      src/ProtocolBuffers/SortedList.cs
  15. 5
      src/ProtocolBuffers/UnknownFieldSet.cs

@ -163,7 +163,7 @@ namespace Google.ProtocolBuffers {
/// Read a double field from the stream.
/// </summary>
public double ReadDouble() {
#if SILVERLIGHT2
#if SILVERLIGHT2 || COMPACT_FRAMEWORK_35
byte[] bytes = ReadRawBytes(8);
return BitConverter.ToDouble(bytes, 0);
#else

@ -332,7 +332,7 @@ namespace Google.ProtocolBuffers {
/// </summary>
public void WriteDoubleNoTag(double value) {
// TODO(jonskeet): Test this on different endiannesses
#if SILVERLIGHT2
#if SILVERLIGHT2 || COMPACT_FRAMEWORK_35
byte[] bytes = BitConverter.GetBytes(value);
WriteRawBytes(bytes, 0, 8);
#else
@ -1140,4 +1140,4 @@ namespace Google.ProtocolBuffers {
}
}
}
}
}

@ -64,13 +64,12 @@ namespace Google.ProtocolBuffers.FieldAccess {
public static Func<TSource, object> CreateUpcastDelegateImpl<TSource, TResult>(MethodInfo method) {
// Convert the reflection call into an open delegate, i.e. instead of calling x.Method()
// we'll call getter(x).
Func<TSource, TResult> getter = (Func<TSource, TResult>)Delegate.CreateDelegate(typeof(Func<TSource, TResult>), method);
Func<TSource, TResult> getter = (Func<TSource, TResult>)Delegate.CreateDelegate(typeof(Func<TSource, TResult>), null, method);
// Implicit upcast to object (within the delegate)
return delegate(TSource source) { return getter(source); };
}
/// <summary>
/// Creates a delegate which will execute the given method after casting the parameter
/// down from object to the required parameter type.
@ -84,7 +83,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
public static Action<TSource, object> CreateDowncastDelegateImpl<TSource, TParam>(MethodInfo method) {
// Convert the reflection call into an open delegate, i.e. instead of calling x.Method(y) we'll
// call Method(x, y)
Action<TSource, TParam> call = (Action<TSource, TParam>) Delegate.CreateDelegate(typeof(Action<TSource, TParam>), method);
Action<TSource, TParam> call = (Action<TSource, TParam>) Delegate.CreateDelegate(typeof(Action<TSource, TParam>), null, method);
return delegate(TSource source, object parameter) { call(source, (TParam)parameter); };
}
@ -103,7 +102,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
// Convert the reflection call into an open delegate, i.e. instead of calling x.Method(y) we'll
// call Method(x, y)
Func<TSource, TParam, TReturn> call = (Func<TSource, TParam, TReturn>)
Delegate.CreateDelegate(typeof(Func<TSource, TParam, TReturn>), method);
Delegate.CreateDelegate(typeof(Func<TSource, TParam, TReturn>), null, method);
return delegate(TSource source, object parameter) { call(source, (TParam)parameter); };
}
@ -118,7 +117,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
}
public static Func<IBuilder> CreateStaticUpcastDelegateImpl<T>(MethodInfo method) {
Func<T> call = (Func<T>)Delegate.CreateDelegate(typeof(Func<T>), method);
Func<T> call = (Func<T>)Delegate.CreateDelegate(typeof(Func<T>), null, method);
return delegate { return (IBuilder)call(); };
}
}

@ -52,7 +52,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
private readonly Func<IBuilder> createBuilderDelegate;
internal RepeatedMessageAccessor(string name) : base(name) {
MethodInfo createBuilderMethod = ClrType.GetMethod("CreateBuilder", Type.EmptyTypes);
MethodInfo createBuilderMethod = ClrType.GetMethod("CreateBuilder", EmptyTypes);
if (createBuilderMethod == null) {
throw new ArgumentException("No public static CreateBuilder method declared in " + ClrType.Name);
}

@ -35,7 +35,7 @@ using System.Reflection;
namespace Google.ProtocolBuffers.FieldAccess {
/// <summary>
/// Accesor for a repeated field of type int, ByteString etc.
/// Accessor for a repeated field of type int, ByteString etc.
/// </summary>
internal class RepeatedPrimitiveAccessor<TMessage, TBuilder> : IFieldAccessor<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
@ -49,7 +49,9 @@ namespace Google.ProtocolBuffers.FieldAccess {
private readonly Func<TMessage, int> countDelegate;
private readonly MethodInfo getElementMethod;
private readonly MethodInfo setElementMethod;
// Replacement for Type.EmptyTypes which apparently isn't available on the compact framework
internal static readonly Type[] EmptyTypes = new Type[0];
/// <summary>
/// The CLR type of the field (int, the enum type, ByteString, the message etc).
@ -64,7 +66,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
PropertyInfo messageProperty = typeof(TMessage).GetProperty(name + "List");
PropertyInfo builderProperty = typeof(TBuilder).GetProperty(name + "List");
PropertyInfo countProperty = typeof(TMessage).GetProperty(name + "Count");
MethodInfo clearMethod = typeof(TBuilder).GetMethod("Clear" + name, Type.EmptyTypes);
MethodInfo clearMethod = typeof(TBuilder).GetMethod("Clear" + name, EmptyTypes);
getElementMethod = typeof(TMessage).GetMethod("Get" + name, new Type[] { typeof(int) });
clrType = getElementMethod.ReturnType;
MethodInfo addMethod = typeof(TBuilder).GetMethod("Add" + name, new Type[] { ClrType });
@ -78,9 +80,9 @@ namespace Google.ProtocolBuffers.FieldAccess {
|| setElementMethod == null) {
throw new ArgumentException("Not all required properties/methods available");
}
clearDelegate = (Func<TBuilder, IBuilder>)Delegate.CreateDelegate(typeof(Func<TBuilder, IBuilder>), clearMethod);
clearDelegate = (Func<TBuilder, IBuilder>)Delegate.CreateDelegate(typeof(Func<TBuilder, IBuilder>), null, clearMethod);
countDelegate = (Func<TMessage, int>)Delegate.CreateDelegate
(typeof(Func<TMessage, int>), countProperty.GetGetMethod());
(typeof(Func<TMessage, int>), null, countProperty.GetGetMethod());
getValueDelegate = ReflectionUtil.CreateUpcastDelegate<TMessage>(messageProperty.GetGetMethod());
addValueDelegate = ReflectionUtil.CreateDowncastDelegateIgnoringReturn<TBuilder>(addMethod);
getRepeatedWrapperDelegate = ReflectionUtil.CreateUpcastDelegate<TBuilder>(builderProperty.GetGetMethod());

@ -48,7 +48,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
private readonly Func<IBuilder> createBuilderDelegate;
internal SingleMessageAccessor(string name) : base(name) {
MethodInfo createBuilderMethod = ClrType.GetMethod("CreateBuilder", Type.EmptyTypes);
MethodInfo createBuilderMethod = ClrType.GetMethod("CreateBuilder", EmptyTypes);
if (createBuilderMethod == null) {
throw new ArgumentException("No public static CreateBuilder method declared in " + ClrType.Name);
}

@ -46,6 +46,8 @@ namespace Google.ProtocolBuffers.FieldAccess {
private readonly Func<TMessage, bool> hasDelegate;
private readonly Func<TBuilder, IBuilder> clearDelegate;
internal static readonly Type[] EmptyTypes = new Type[0];
/// <summary>
/// The CLR type of the field (int, the enum type, ByteString, the message etc).
/// As declared by the property.
@ -59,13 +61,13 @@ namespace Google.ProtocolBuffers.FieldAccess {
PropertyInfo builderProperty = typeof(TBuilder).GetProperty(name);
if (builderProperty == null) builderProperty = typeof(TBuilder).GetProperty(name);
PropertyInfo hasProperty = typeof(TMessage).GetProperty("Has" + name);
MethodInfo clearMethod = typeof(TBuilder).GetMethod("Clear" + name, Type.EmptyTypes);
MethodInfo clearMethod = typeof(TBuilder).GetMethod("Clear" + name, EmptyTypes);
if (messageProperty == null || builderProperty == null || hasProperty == null || clearMethod == null) {
throw new ArgumentException("Not all required properties/methods available");
}
clrType = messageProperty.PropertyType;
hasDelegate = (Func<TMessage, bool>)Delegate.CreateDelegate(typeof(Func<TMessage, bool>), hasProperty.GetGetMethod());
clearDelegate = (Func<TBuilder, IBuilder>)Delegate.CreateDelegate(typeof(Func<TBuilder, IBuilder>), clearMethod);
hasDelegate = (Func<TMessage, bool>)Delegate.CreateDelegate(typeof(Func<TMessage, bool>), null, hasProperty.GetGetMethod());
clearDelegate = (Func<TBuilder, IBuilder>)Delegate.CreateDelegate(typeof(Func<TBuilder, IBuilder>), null ,clearMethod);
getValueDelegate = ReflectionUtil.CreateUpcastDelegate<TMessage>(messageProperty.GetGetMethod());
setValueDelegate = ReflectionUtil.CreateDowncastDelegate<TBuilder>(builderProperty.GetSetMethod());
}

@ -65,8 +65,8 @@ namespace Google.ProtocolBuffers {
}
public static FieldSet CreateInstance() {
// Use SortedDictionary to keep fields in the canonical order
return new FieldSet(new SortedDictionary<FieldDescriptor, object>());
// Use SortedList to keep fields in the canonical order
return new FieldSet(new SortedList<FieldDescriptor, object>());
}
/// <summary>
@ -85,7 +85,7 @@ namespace Google.ProtocolBuffers {
}
if (hasRepeats) {
var tmp = new SortedDictionary<FieldDescriptor, object>();
var tmp = new SortedList<FieldDescriptor, object>();
foreach (KeyValuePair<FieldDescriptor, object> entry in fields) {
IList<object> list = entry.Value as IList<object>;
tmp[entry.Key] = list == null ? entry.Value : Lists.AsReadOnly(list);

@ -69,8 +69,8 @@ namespace Google.ProtocolBuffers {
internal IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
// Use a SortedDictionary so we'll end up serializing fields in order
var ret = new SortedDictionary<FieldDescriptor, object>();
// Use a SortedList so we'll end up serializing fields in order
var ret = new SortedList<FieldDescriptor, object>();
MessageDescriptor descriptor = DescriptorForType;
foreach (FieldDescriptor field in descriptor.Fields) {
IFieldAccessor<TMessage, TBuilder> accessor = InternalFieldAccessors[field];

@ -54,6 +54,9 @@ namespace Google.ProtocolBuffers {
private readonly ExtensionRegistry extensionRegistry;
private readonly int sizeLimit;
// Type.EmptyTypes isn't present on the compact framework
private static readonly Type[] EmptyTypes = new Type[0];
/// <summary>
/// Delegate created via reflection trickery (once per type) to create a builder
/// and read a message from a CodedInputStream with it. Note that unlike in Java,
@ -77,7 +80,7 @@ namespace Google.ProtocolBuffers {
Type builderType = FindBuilderType();
// Yes, it's redundant to find this again, but it's only the once...
MethodInfo createBuilderMethod = typeof(TMessage).GetMethod("CreateBuilder", Type.EmptyTypes);
MethodInfo createBuilderMethod = typeof(TMessage).GetMethod("CreateBuilder", EmptyTypes);
Delegate builderBuilder = Delegate.CreateDelegate(
typeof(Func<>).MakeGenericType(builderType), null, createBuilderMethod);
@ -102,7 +105,7 @@ namespace Google.ProtocolBuffers {
/// Works out the builder type for TMessage, or throws an ArgumentException to explain why it can't.
/// </summary>
private static Type FindBuilderType() {
MethodInfo createBuilderMethod = typeof(TMessage).GetMethod("CreateBuilder", Type.EmptyTypes);
MethodInfo createBuilderMethod = typeof(TMessage).GetMethod("CreateBuilder", EmptyTypes);
if (createBuilderMethod == null) {
throw new ArgumentException("Message type " + typeof(TMessage).FullName + " has no CreateBuilder method.");
}

@ -64,7 +64,9 @@ using System.Runtime.CompilerServices;
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
#if !COMPACT_FRAMEWORK_35
[assembly: AssemblyFileVersion("1.0.0.0")]
#endif
[assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+

@ -114,7 +114,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RpcUtil.cs" />
<Compile Include="SilverlightCompatibility.cs" />
<Compile Include="SortedDictionary.cs" />
<Compile Include="SortedList.cs" />
<Compile Include="TextFormat.cs" />
<Compile Include="TextGenerator.cs" />
<Compile Include="TextTokenizer.cs" />

@ -0,0 +1,143 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{49B51802-9D09-4AD8-A0EE-0DA704EFA379}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Google.ProtocolBuffers</RootNamespace>
<AssemblyName>Google.ProtocolBuffers</AssemblyName>
<ProjectTypeGuids>{4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<PlatformFamilyName>PocketPC</PlatformFamilyName>
<PlatformID>b2c48bd2-963d-4549-9169-1fa021dce484</PlatformID>
<OSVersion>5.2</OSVersion>
<DeployDirSuffix>compactframework</DeployDirSuffix>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<NativePlatformName>Windows Mobile 6 Professional SDK</NativePlatformName>
<FormFactorID>
</FormFactorID>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>COMPACT_FRAMEWORK_35;DEBUG;TRACE;$(PlatformFamilyName)</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<FileAlignment>512</FileAlignment>
<WarningLevel>4</WarningLevel>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>COMPACT_FRAMEWORK_35;TRACE;$(PlatformFamilyName)</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<FileAlignment>512</FileAlignment>
<WarningLevel>4</WarningLevel>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
</PropertyGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
<Compile Include="AbstractBuilder.cs" />
<Compile Include="AbstractMessage.cs" />
<Compile Include="ByteString.cs" />
<Compile Include="CodedInputStream.cs" />
<Compile Include="CodedOutputStream.cs" />
<Compile Include="Collections\Dictionaries.cs" />
<Compile Include="Collections\Enumerables.cs" />
<Compile Include="Collections\IPopsicleList.cs" />
<Compile Include="Collections\Lists.cs" />
<Compile Include="Collections\PopsicleList.cs" />
<Compile Include="Collections\ReadOnlyDictionary.cs" />
<Compile Include="Delegates.cs" />
<Compile Include="DescriptorProtos\CSharpOptions.cs" />
<Compile Include="DescriptorProtos\DescriptorProtoFile.cs" />
<Compile Include="DescriptorProtos\IDescriptorProto.cs" />
<Compile Include="DescriptorProtos\PartialClasses.cs" />
<Compile Include="Descriptors\DescriptorBase.cs" />
<Compile Include="Descriptors\DescriptorPool.cs" />
<Compile Include="Descriptors\DescriptorUtil.cs" />
<Compile Include="Descriptors\DescriptorValidationException.cs" />
<Compile Include="Descriptors\EnumDescriptor.cs" />
<Compile Include="Descriptors\EnumValueDescriptor.cs" />
<Compile Include="Descriptors\FieldDescriptor.cs" />
<Compile Include="Descriptors\FieldMappingAttribute.cs" />
<Compile Include="Descriptors\FieldType.cs" />
<Compile Include="Descriptors\FileDescriptor.cs" />
<Compile Include="Descriptors\IDescriptor.cs" />
<Compile Include="Descriptors\IndexedDescriptorBase.cs" />
<Compile Include="Descriptors\MappedType.cs" />
<Compile Include="Descriptors\MessageDescriptor.cs" />
<Compile Include="Descriptors\MethodDescriptor.cs" />
<Compile Include="Descriptors\PackageDescriptor.cs" />
<Compile Include="Descriptors\ServiceDescriptor.cs" />
<Compile Include="DynamicMessage.cs" />
<Compile Include="ExtendableBuilder.cs" />
<Compile Include="ExtendableMessage.cs" />
<Compile Include="ExtensionInfo.cs" />
<Compile Include="ExtensionRegistry.cs" />
<Compile Include="FieldAccess\FieldAccessorTable.cs" />
<Compile Include="FieldAccess\IFieldAccessor.cs" />
<Compile Include="FieldAccess\ReflectionUtil.cs" />
<Compile Include="FieldAccess\RepeatedEnumAccessor.cs" />
<Compile Include="FieldAccess\RepeatedMessageAccessor.cs" />
<Compile Include="FieldAccess\RepeatedPrimitiveAccessor.cs" />
<Compile Include="FieldAccess\SingleEnumAccessor.cs" />
<Compile Include="FieldAccess\SingleMessageAccessor.cs" />
<Compile Include="FieldAccess\SinglePrimitiveAccessor.cs" />
<Compile Include="FieldSet.cs" />
<Compile Include="GeneratedBuilder.cs" />
<Compile Include="GeneratedExtensionBase.cs" />
<Compile Include="GeneratedMessage.cs" />
<Compile Include="GeneratedRepeatExtension.cs" />
<Compile Include="GeneratedSingleExtension.cs" />
<Compile Include="IBuilder.cs" />
<Compile Include="IMessage.cs" />
<Compile Include="InvalidProtocolBufferException.cs" />
<Compile Include="IRpcChannel.cs" />
<Compile Include="IRpcController.cs" />
<Compile Include="IService.cs" />
<Compile Include="MessageStreamIterator.cs" />
<Compile Include="MessageStreamWriter.cs" />
<Compile Include="MessageUtil.cs" />
<Compile Include="NameHelpers.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RpcUtil.cs" />
<Compile Include="SilverlightCompatibility.cs" />
<Compile Include="SortedList.cs" />
<Compile Include="TextFormat.cs" />
<Compile Include="TextGenerator.cs" />
<Compile Include="TextTokenizer.cs" />
<Compile Include="ThrowHelper.cs" />
<Compile Include="UninitializedMessageException.cs" />
<Compile Include="UnknownField.cs" />
<Compile Include="UnknownFieldSet.cs" />
<Compile Include="WireFormat.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" />
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}">
<HostingProcess disable="1" />
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

@ -46,7 +46,7 @@ namespace Google.ProtocolBuffers
/// This is only used for Silverlight, which doesn't have the normal
/// sorted collections.
/// </summary>
internal sealed class SortedDictionary<TKey, TValue> : IDictionary<TKey, TValue>
internal sealed class SortedList<TKey, TValue> : IDictionary<TKey, TValue>
{
private readonly IDictionary<TKey, TValue> wrapped = new Dictionary<TKey, TValue>();

@ -243,11 +243,10 @@ namespace Google.ProtocolBuffers {
public sealed class Builder
{
/// <summary>
/// Mapping from number to field. Note that by using a SortedDictionary we ensure
/// Mapping from number to field. Note that by using a SortedList we ensure
/// that the fields will be serialized in ascending order.
/// </summary>
private IDictionary<int, UnknownField> fields = new SortedDictionary<int, UnknownField>();
private IDictionary<int, UnknownField> fields = new SortedList<int, UnknownField>();
// Optimization: We keep around a builder for the last field that was
// modified so that we can efficiently add to it multiple times in a
// row (important when parsing an unknown repeated field).

Loading…
Cancel
Save