Merge pull request #2 from jtattermusch/csharp_protobuf_imported
Pulling protobuf-csharp-port into csharp/ directorypull/288/head
commit
01c8c35ca3
412 changed files with 203129 additions and 0 deletions
@ -0,0 +1,43 @@ |
|||||||
|
# |
||||||
|
# Untracked directories |
||||||
|
# |
||||||
|
src/AddressBook/bin |
||||||
|
src/AddressBook/obj |
||||||
|
src/ProtocolBuffers/bin/ |
||||||
|
src/ProtocolBuffers/obj/ |
||||||
|
src/ProtocolBuffers/objCF |
||||||
|
src/ProtocolBuffers.Test/bin/ |
||||||
|
src/ProtocolBuffers.Test/obj/ |
||||||
|
src/ProtocolBuffersLite.Test/bin/ |
||||||
|
src/ProtocolBuffersLite.Test/obj/ |
||||||
|
src/ProtoBench/bin/ |
||||||
|
src/ProtoBench/obj/ |
||||||
|
src/ProtoDump/bin/ |
||||||
|
src/ProtoDump/obj/ |
||||||
|
src/ProtoGen/bin/ |
||||||
|
src/ProtoGen/obj/ |
||||||
|
src/ProtoGen.Test/bin/ |
||||||
|
src/ProtoGen.Test/obj/ |
||||||
|
src/ProtoMunge/bin/ |
||||||
|
src/ProtoMunge/obj/ |
||||||
|
mono/bin |
||||||
|
mono/tmp |
||||||
|
mono/protoc |
||||||
|
build_output |
||||||
|
build_temp |
||||||
|
build/msbuild*.log |
||||||
|
lib/Microsoft.Silverlight.Testing |
||||||
|
lib/NUnit |
||||||
|
|
||||||
|
# |
||||||
|
# Untracked files |
||||||
|
# |
||||||
|
*.user |
||||||
|
*.suo |
||||||
|
_ReSharper.* |
||||||
|
*.sln.cache |
||||||
|
mono/TestResult.xml |
||||||
|
mono/.libs |
||||||
|
mono/*.exe |
||||||
|
mono/*.dll |
||||||
|
lib/protoc.exe |
@ -0,0 +1,148 @@ |
|||||||
|
=============================================================================== |
||||||
|
Welcome to the C# port of Google Protocol Buffers, written by Jon Skeet |
||||||
|
(skeet@pobox.com) based on the work of many talented people. |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
RELEASE NOTES - Code imported into Google's main protobuf repository |
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
Everything below note this represents history of protobuf-csharp-port project |
||||||
|
before the code was merged into csharp/ subtree of GitHub google/protobuf |
||||||
|
repository. |
||||||
|
Frozen legacy version of the original project is available in |
||||||
|
https://github.com/jskeet/protobuf-csharp-port. |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
RELEASE NOTES - Version 2.4.1.555 |
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
Changes: |
||||||
|
- Upgrade solution format to Visual Studio 2012. |
||||||
|
- Add the ability to print a builder (not just a message) |
||||||
|
- TextGenerator introduces a new overload of PrintTo |
||||||
|
- Munge protoc's error format into a VS-C#-compatible output format. |
||||||
|
- Work to make ProtoGen clone that acts as a protoc.exe plugin. |
||||||
|
- Added the AllowPartiallyTrustedCallers attribute |
||||||
|
- Optimized enum parsing. |
||||||
|
|
||||||
|
Fixes: |
||||||
|
- Fix for bug in limited input stream's Position, Introduced Position on |
||||||
|
output stream |
||||||
|
- Fix for writing a character to a JSON output overflows allocated buffer |
||||||
|
- Optimize FromBase64String to return Empty when presented with empty string. |
||||||
|
- Use string.Concat instead of operator to avoid potential import problems |
||||||
|
- Issue 81: quoting for NUnit parameters. |
||||||
|
- Issue 56: NuGet package is noisy |
||||||
|
- Issue 70: Portable library project has some invalid Nunit-based code. |
||||||
|
- Issue 71: CodedInputStream.ReadBytes go to slow path unnecessarily |
||||||
|
- Issue 84: warning CS0219: The variable `size' is assigned but never used |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
RELEASE NOTES - Version 2.4.1.521 |
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
Changes: |
||||||
|
- Add generated_code_attributes option, defaulted to false |
||||||
|
- Added support for Portable library |
||||||
|
- Added 'Unsafe' static type in ByteString to allow direct buffer access |
||||||
|
|
||||||
|
Fixes: |
||||||
|
- Issue 50: The XML serializer will fail to deserialize a message with empty |
||||||
|
child message |
||||||
|
- Issue 45: Use of 'item' as a field name causes AmbiguousMatchException |
||||||
|
- Issue 49: Generated nested static Types class should be partial |
||||||
|
- Issue 38: Disable CLSCompliant warnings (3021) |
||||||
|
- Issue 40: proto_path does not work for command-line file names |
||||||
|
- Issue 54: should retire all bytes in buffer (bufferSize) |
||||||
|
- Issue 43: Fix to correct identical 'umbrella_classname' options from trying |
||||||
|
to write to the same filename. |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
RELEASE NOTES - Version 2.4.1.473 |
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
Features: |
||||||
|
- Added option service_generator_type to control service generation with |
||||||
|
NONE, GENERIC, INTERFACE, or IRPCDISPATCH |
||||||
|
- Added interfaces IRpcDispatch and IRpcServerStub to provide for blocking |
||||||
|
services and implementations. |
||||||
|
- Added ProtoGen.exe command-line argument "--protoc_dir=" to specify the |
||||||
|
location of protoc.exe. |
||||||
|
- Extracted interfaces for ICodedInputStream and ICodedOutputStream to allow |
||||||
|
custom implementation of writers with both speed and size optimizations. |
||||||
|
- Addition of the "Google.ProtoBuffers.Serialization" assembly to support |
||||||
|
reading and writing messages to/from XML, JSON, IDictionary<,> and others. |
||||||
|
- Several performance related fixes and tweeks |
||||||
|
- Issue 3: Add option to mark generated code with attribute |
||||||
|
- Issue 20: Support for decorating classes [Serializable] |
||||||
|
- Issue 21: Decorate fields with [deprecated=true] as [System.Obsolete] |
||||||
|
- Issue 22: Reusable Builder classes |
||||||
|
- Issue 24: Support for using Json/Xml formats with ICodedInputStream |
||||||
|
- Issue 25: Added support for NuGet packages |
||||||
|
- Issue 31: Upgraded protoc.exe and descriptor to 2.4.1 |
||||||
|
|
||||||
|
Fixes: |
||||||
|
- Issue 13: Message with Field same name as message causes uncompilable .cs |
||||||
|
- Issue 16: Does not integrate well with other tooling |
||||||
|
- Issue 19: Support for negative enum values |
||||||
|
- Issue 26: AddRange in GeneratedBuilder iterates twice. |
||||||
|
- Issue 27: Remove XML documentation output from test projects to clear |
||||||
|
warnings/errors. |
||||||
|
- Issue 28: Circular message dependencies result in null default values for |
||||||
|
Message fields. |
||||||
|
- Issue 29: Message classes generated have a public default constructor. You |
||||||
|
can disable private ctor generation with the option generate_private_ctor. |
||||||
|
- Issue 35: Fixed a bug in ProtoGen handling of arguments with trailing \ |
||||||
|
- Big-endian support for float, and double on Silverlight |
||||||
|
- Packed and Unpacked parsing allow for all repeated, as per version 2.3 |
||||||
|
- Fix for leaving Builder a public ctor on internal classes for use with |
||||||
|
generic "where T: new()" constraints. |
||||||
|
|
||||||
|
Other: |
||||||
|
- Changed the code signing key to a privately held key |
||||||
|
- Reformatted all code and line-endings to C# defaults |
||||||
|
- Reworking of performance benchmarks to produce reliable results, option /v2 |
||||||
|
- Issue 34: Silverlight assemblies are now unit tested |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
RELEASE NOTES - Version 2.3.0.277 |
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
Features: |
||||||
|
- Added cls_compliance option to generate attributes indicating |
||||||
|
non-CLS-compliance. |
||||||
|
- Added file_extension option to control the generated output file's extension. |
||||||
|
- Added umbrella_namespace option to place the umbrella class into a nested |
||||||
|
namespace to address issues with proto files having the same name as a |
||||||
|
message it contains. |
||||||
|
- Added output_directory option to set the output path for the source file(s). |
||||||
|
- Added ignore_google_protobuf option to avoid generating code for includes |
||||||
|
from the google.protobuf package. |
||||||
|
- Added the LITE framework (Google.ProtoBuffersLite.dll) and the ability to |
||||||
|
generate code with "option optimize_for = LITE_RUNTIME;". |
||||||
|
- Added ability to invoke protoc.exe from within ProtoGen.exe. |
||||||
|
- Upgraded to protoc.exe (2.3) compiler. |
||||||
|
|
||||||
|
Fixes: |
||||||
|
- Issue 9: Class cannot be static and sealed error |
||||||
|
- Issue 12: default value for enumerate fields must be filled out |
||||||
|
|
||||||
|
Other: |
||||||
|
- Rewrite of build using MSBbuild instead of NAnt |
||||||
|
- Moved to NUnit Version 2.2.8.0 |
||||||
|
- Changed to using secure .snk for releases |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
RELEASE NOTES - Version 0.9.1 |
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
Fixes: |
||||||
|
- issue 10: Incorrect encoding of packed fields when serialized |
||||||
|
|
||||||
|
=============================================================================== |
||||||
|
RELEASE NOTES - Version 0.9.0 |
||||||
|
=============================================================================== |
||||||
|
|
||||||
|
- Initial release |
||||||
|
|
||||||
|
=============================================================================== |
@ -0,0 +1,17 @@ |
|||||||
|
This directory contains a library that implements Protocol Buffers |
||||||
|
functionality in C#. |
||||||
|
|
||||||
|
Experimental only |
||||||
|
----------------- |
||||||
|
|
||||||
|
C# protobufs are currently under development and are not officially supported yet. |
||||||
|
Also, as of now, only proto2 is supported. Proto3 support for C# is currently in progress |
||||||
|
(both design & implementation). |
||||||
|
|
||||||
|
History of C# protobufs |
||||||
|
----------------------- |
||||||
|
|
||||||
|
This subtree was originally imported from https://github.com/jskeet/protobuf-csharp-port |
||||||
|
and represents the latest development version of C# protobufs, that will now be developed |
||||||
|
and maintained by Google. All the development will be done in open, under this repository |
||||||
|
(https://github.com/google/protobuf). |
@ -0,0 +1,8 @@ |
|||||||
|
@echo off |
||||||
|
SET BUILD_TARGET=%~1 |
||||||
|
SET BUILD_CONFIG=%~2 |
||||||
|
|
||||||
|
IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild |
||||||
|
IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug |
||||||
|
|
||||||
|
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo build.csproj /t:%BUILD_TARGET% /toolsversion:4.0 "/p:Configuration=%BUILD_CONFIG%" %3 %4 %5 %6 |
@ -0,0 +1,122 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Targets For Clean |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<Target Name="_CleanFolder"> |
||||||
|
<Message Importance="normal" Text="Removing temporary directory '$(CleanFolderDirectory)'"/> |
||||||
|
<Error Text="Can not remove empty directory name." Condition=" '$(CleanFolderDirectory)' == '' " /> |
||||||
|
|
||||||
|
<Exec WorkingDirectory="$(MSBuildProjectDirectory)" Condition="Exists($(CleanFolderDirectory))" Outputs="@(Ignore)" |
||||||
|
Command="MOVE /Y "$(CleanFolderDirectory)" "$(CleanFolderDirectory)-deleted" > NUL" /> |
||||||
|
|
||||||
|
<RemoveDir Directories="$(CleanFolderDirectory)-deleted" Condition="Exists('$(CleanFolderDirectory)-deleted')" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_CleanTempOutput"> |
||||||
|
<MSBuild Projects="$(MSBuildProjectFullPath)" Properties="CleanFolderDirectory=%(TempBuildFolder.Identity);" Targets="_CleanFolder" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_CleanAll" DependsOnTargets="_CleanTempOutput"> |
||||||
|
<MakeDir Directories="$(BuildTempDirectory)" /> |
||||||
|
<MakeDir Directories="$(BuildOutputDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Targets For Build |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<Target Name="_CompileAll"> |
||||||
|
<MSBuild Projects="$(MSBuildProjectFullPath)" Properties="SolutionTarget=Rebuild;" Targets="_BuildAllConfigurations" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_BuildAllConfigurations"> |
||||||
|
<MSBuild Properties="TargetVersion=cf20;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MSBuild Properties="TargetVersion=cf35;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MSBuild Properties="TargetVersion=net20;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MSBuild Properties="TargetVersion=net35;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MSBuild Properties="TargetVersion=net40;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MSBuild Properties="TargetVersion=sl20;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MSBuild Properties="TargetVersion=sl30;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MSBuild Properties="TargetVersion=sl40;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MSBuild Properties="TargetVersion=pl40;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Targets For Tools |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<Target Name="_BuildTools"> |
||||||
|
|
||||||
|
<MSBuild Targets="Build" ToolsVersion="3.5" Projects="$(ProjectDirectory)\src\ProtocolBuffers.sln" Properties="Configuration=Release;Platform=Any CPU;" /> |
||||||
|
<Copy SourceFiles="%(ToolsOutputItem.Identity)" DestinationFolder="$(BuildOutputDirectory)\tools" /> |
||||||
|
|
||||||
|
<Copy SourceFiles="$(LibDirectory)\NUnit-config\nunit-console.v2.0.config" DestinationFiles="$(NUnitExePath).config" /> |
||||||
|
<Exec |
||||||
|
WorkingDirectory="%(ToolsTestContainer.RootDir)%(ToolsTestContainer.Directory)" |
||||||
|
Command=""$(NUnitExePath)" /nologo /noshadow "%(ToolsTestContainer.Identity)" /xml:"$(BuildTempDirectory)\%(ToolsTestContainer.Filename).xml"" /> |
||||||
|
|
||||||
|
</Target> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Targets For GenerateSource |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<Target Name="_GenerateProjects"> |
||||||
|
<Exec Command=""$(CsProjectProjector)" csproj_templates src\ProtocolBuffersLibrary.sln" WorkingDirectory="$(ProjectDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_CleanTempSource"> |
||||||
|
<MSBuild Projects="$(MSBuildProjectFullPath)" Properties="CleanFolderDirectory=$(SourceTempDirectory);" Targets="_CleanFolder" /> |
||||||
|
<MakeDir Directories="$(SourceTempDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_GenerateSource" DependsOnTargets="_CleanTempSource"> |
||||||
|
<Message Importance="high" Text="Generating source from proto files" /> |
||||||
|
<Exec Command=""$(ProtocExePath)" --proto_path=$(ProtosDirectory) --descriptor_set_out=compiled.pb @(Protos->'%(RelativeDir)%(Filename)%(Extension)', ' ')" WorkingDirectory="$(SourceTempDirectory)" /> |
||||||
|
<Exec Command=""$(ProtogenExePath)" compiled.pb" WorkingDirectory="$(SourceTempDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_CopyGeneratedSource" DependsOnTargets="_GenerateSource"> |
||||||
|
<Copy SourceFiles="%(GeneratedSource.Identity)" DestinationFiles="%(GeneratedSource.TargetDirectory)\%(GeneratedSource.Filename)%(GeneratedSource.Extension)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Targets For Package |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<Target Name="_PackageAll"> |
||||||
|
<MSBuild Projects="$(MSBuildProjectFullPath)" Properties="SolutionTarget=_Publish;" Targets="_BuildAllConfigurations" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_GeneratePackage"> |
||||||
|
<Copy SourceFiles="@(StaticPackageItem)" DestinationFolder="$(BuildOutputPackage)\%(StaticPackageItem.TargetDirectory)\%(StaticPackageItem.RecursiveDir)" /> |
||||||
|
<Exec Command=""$(ZipExePath)" a -tzip $(BuildTempDirectory)\$(PackageName)-binaries.zip * -x!*.pdb -r" WorkingDirectory="$(BuildOutputPackage)" /> |
||||||
|
<Exec Command=""$(ZipExePath)" a -tzip $(BuildTempDirectory)\$(PackageName)-symbols.zip * -r" WorkingDirectory="$(BuildOutputPackage)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Targets For Benchmark |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<Target Name="_RunBenchmarks"> |
||||||
|
<ItemGroup> |
||||||
|
<BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SizeMessage1,ProtoBench" /> |
||||||
|
<BenchmarkParameter Include="google_message1.dat" /> |
||||||
|
<BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SpeedMessage1,ProtoBench" /> |
||||||
|
<BenchmarkParameter Include="google_message1.dat" /> |
||||||
|
<BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SizeMessage2,ProtoBench" /> |
||||||
|
<BenchmarkParameter Include="google_message2.dat" /> |
||||||
|
<BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SpeedMessage2,ProtoBench" /> |
||||||
|
<BenchmarkParameter Include="google_message2.dat" /> |
||||||
|
</ItemGroup> |
||||||
|
|
||||||
|
<Message Text="Running ProtoBench.exe" /> |
||||||
|
<Exec Command="ProtoBench.exe $(BenchmarkArgs) @(BenchmarkParameter->'%(Identity)', ' ') "/log:$(BenchmarkOutputFile)"" |
||||||
|
WorkingDirectory="$(SourceDirectory)\ProtoBench\bin\NET35\Release" /> |
||||||
|
|
||||||
|
</Target> |
||||||
|
|
||||||
|
</Project> |
@ -0,0 +1,59 @@ |
|||||||
|
<?xml version="1.0"?> |
||||||
|
<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nuspec.xsd"> |
||||||
|
<metadata> |
||||||
|
<id>Google.ProtocolBuffers</id> |
||||||
|
<version>$version$</version> |
||||||
|
<owners>Jon Skeet</owners> |
||||||
|
<authors>Jon Skeet</authors> |
||||||
|
<licenseUrl>http://code.google.com/p/protobuf-csharp-port/source/browse/license.txt</licenseUrl> |
||||||
|
<projectUrl>http://code.google.com/p/protobuf-csharp-port/</projectUrl> |
||||||
|
<requireLicenseAcceptance>false</requireLicenseAcceptance> |
||||||
|
<copyright>Copyright 2008 Google Inc. All rights reserved.</copyright> |
||||||
|
<tags>Protocol Buffers Binary Serialization Format Google</tags> |
||||||
|
|
||||||
|
<title>Google.ProtocolBuffers</title> |
||||||
|
<summary>A managed code generator and library for Google's data interchange format.</summary> |
||||||
|
<description><![CDATA[ |
||||||
|
Protocol Buffers is a binary serialization format and technology, released to the open source community by Google in 2008. |
||||||
|
Its primary use is to produce small fast binary representations of a 'message' or object for serialization or transportation. |
||||||
|
There are various implementations of Protocol Buffers in .NET. This project is a fairly close port of the Google Java implementation. |
||||||
|
|
||||||
|
There are two main parts: |
||||||
|
|
||||||
|
tools/protoc.exe, which takes the textual representation of the protocol buffer and turns it into a binary representation for use with ProtoGen.exe. |
||||||
|
tools/ProtoGen.exe, which takes binary representations of protocol buffer descriptors (as generated by the "stock" protoc binary supplied by Google) and creates C# source code. This is only required at build time. |
||||||
|
|
||||||
|
lib/*/Google.ProtocolBuffers.dll, which is a supporting library. This is required at execution time. |
||||||
|
lib/*/Google.ProtocolBuffers.Serialization.dll, a supplementary library that provides extensions for reading and writing protocol buffers to xml, json, and others. |
||||||
|
|
||||||
|
LINKS: |
||||||
|
|
||||||
|
Project Home - http://code.google.com/p/protobuf-csharp-port |
||||||
|
Online Help - http://help.protobuffers.net |
||||||
|
Developer Guide - http://code.google.com/apis/protocolbuffers/docs/overview.html |
||||||
|
Language Guide - http://code.google.com/apis/protocolbuffers/docs/proto.html |
||||||
|
|
||||||
|
]]></description> |
||||||
|
|
||||||
|
<references> |
||||||
|
<reference file="Google.ProtocolBuffers.dll"/> |
||||||
|
<reference file="Google.ProtocolBuffers.Serialization.dll"/> |
||||||
|
</references> |
||||||
|
|
||||||
|
</metadata> |
||||||
|
<files> |
||||||
|
<!-- Release Binaries --> |
||||||
|
<file src="..\build_output\Release\**\Google.ProtocolBuffers.???" target="lib\" /> |
||||||
|
<file src="..\build_output\Release\**\Google.ProtocolBuffers.Serialization.???" target="lib\" /> |
||||||
|
<!-- Tools --> |
||||||
|
<file src="..\build_output\tools\**\*" target="tools\" /> |
||||||
|
<file src="..\build_output\protos\**\*" target="tools\" /> |
||||||
|
<!-- Content --> |
||||||
|
<file src="..\build_output\CHANGES.txt" target="tools\"/> |
||||||
|
<file src="..\build_output\license.txt" target="tools\"/> |
||||||
|
<file src="..\build_output\tools\protoc-license.txt" target="tools\"/> |
||||||
|
<!-- Source --> |
||||||
|
<file src="..\src\ProtocolBuffers\**\*.cs" target="src\ProtocolBuffers\"/> |
||||||
|
<file src="..\src\ProtocolBuffers.Serialization\**\*.cs" target="src\ProtocolBuffers.Serialization\"/> |
||||||
|
</files> |
||||||
|
</package> |
@ -0,0 +1,60 @@ |
|||||||
|
<?xml version="1.0"?> |
||||||
|
<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nuspec.xsd"> |
||||||
|
<metadata> |
||||||
|
<id>Google.ProtocolBuffersLite</id> |
||||||
|
<version>$version$</version> |
||||||
|
<owners>Jon Skeet</owners> |
||||||
|
<authors>Jon Skeet</authors> |
||||||
|
<licenseUrl>http://code.google.com/p/protobuf-csharp-port/source/browse/license.txt</licenseUrl> |
||||||
|
<projectUrl>http://code.google.com/p/protobuf-csharp-port/</projectUrl> |
||||||
|
<requireLicenseAcceptance>false</requireLicenseAcceptance> |
||||||
|
<copyright>Copyright 2008 Google Inc. All rights reserved.</copyright> |
||||||
|
<tags>Protocol Buffers Binary Serialization Format Google</tags> |
||||||
|
|
||||||
|
<title>Google.ProtocolBuffersLite</title> |
||||||
|
<summary>A managed code generator and library for Google's data interchange format.</summary> |
||||||
|
<description><![CDATA[ |
||||||
|
Protocol Buffers is a binary serialization format and technology, released to the open source community by Google in 2008. |
||||||
|
Its primary use is to produce small fast binary representations of a 'message' or object for serialization or transportation. |
||||||
|
There are various implementations of Protocol Buffers in .NET. This project is a fairly close port of the Google Java implementation. |
||||||
|
|
||||||
|
There are two main parts: |
||||||
|
|
||||||
|
tools/protoc.exe, which takes the textual representation of the protocol buffer and turns it into a binary representation for use with ProtoGen.exe. |
||||||
|
tools/ProtoGen.exe, which takes binary representations of protocol buffer descriptors (as generated by the "stock" protoc binary supplied by Google) and creates C# source code. This is only required at build time. |
||||||
|
|
||||||
|
lib/*/Google.ProtocolBuffersLite.dll, which is a supporting library. This is required at execution time. |
||||||
|
lib/*/Google.ProtocolBuffersLite.Serialization.dll, a supplementary library that provides extensions for reading and writing protocol buffers to xml, json, and others. |
||||||
|
|
||||||
|
LINKS: |
||||||
|
|
||||||
|
Project Home - http://code.google.com/p/protobuf-csharp-port |
||||||
|
Online Help - http://help.protobuffers.net |
||||||
|
Developer Guide - http://code.google.com/apis/protocolbuffers/docs/overview.html |
||||||
|
Language Guide - http://code.google.com/apis/protocolbuffers/docs/proto.html |
||||||
|
|
||||||
|
]]></description> |
||||||
|
|
||||||
|
<references> |
||||||
|
<reference file="Google.ProtocolBuffersLite.dll"/> |
||||||
|
<reference file="Google.ProtocolBuffersLite.Serialization.dll"/> |
||||||
|
</references> |
||||||
|
|
||||||
|
</metadata> |
||||||
|
|
||||||
|
<files> |
||||||
|
<!-- Release Binaries --> |
||||||
|
<file src="..\build_output\Release\**\Google.ProtocolBuffersLite.???" target="lib\" /> |
||||||
|
<file src="..\build_output\Release\**\Google.ProtocolBuffersLite.Serialization.???" target="lib\" /> |
||||||
|
<!-- Tools --> |
||||||
|
<file src="..\build_output\tools\**\*" target="tools\" /> |
||||||
|
<file src="..\build_output\protos\**\*" target="tools\" /> |
||||||
|
<!-- Content --> |
||||||
|
<file src="..\build_output\CHANGES.txt" target="tools\"/> |
||||||
|
<file src="..\build_output\license.txt" target="tools\"/> |
||||||
|
<file src="..\build_output\tools\protoc-license.txt" target="tools\"/> |
||||||
|
<!-- Source --> |
||||||
|
<file src="..\src\ProtocolBuffers\**\*.cs" target="src\ProtocolBuffers\"/> |
||||||
|
<file src="..\src\ProtocolBuffers.Serialization\**\*.cs" target="src\ProtocolBuffers.Serialization\"/> |
||||||
|
</files> |
||||||
|
</package> |
@ -0,0 +1,2 @@ |
|||||||
|
@echo off |
||||||
|
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo build.csproj /toolsversion:4.0 /t:RunBenchmarks %1 %2 %3 %4 |
@ -0,0 +1,20 @@ |
|||||||
|
@echo off |
||||||
|
SET BUILD_VERSION=%~1 |
||||||
|
SET BUILD_TARGET=%~2 |
||||||
|
SET BUILD_CONFIG=%~3 |
||||||
|
|
||||||
|
IF NOT "%BUILD_VERSION%"=="" GOTO RUN |
||||||
|
ECHO. |
||||||
|
ECHO Usage: build.bat platform [target] [config] [msbuild arguments] |
||||||
|
ECHO. |
||||||
|
ECHO - platform: CF20, CF35, NET20, NET35, NET40, PL40, SL20, SL30, or SL40 |
||||||
|
ECHO - [target]: Rebuild, Clean, Build, Test, or Publish |
||||||
|
ECHO - [config]: Debug or Release |
||||||
|
ECHO. |
||||||
|
EXIT /B 1 |
||||||
|
|
||||||
|
:RUN |
||||||
|
IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild |
||||||
|
IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug |
||||||
|
|
||||||
|
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo target.csproj /toolsversion:4.0 %4 %5 %6 "/t:%BUILD_TARGET%" "/p:Configuration=%BUILD_CONFIG%;TargetVersion=%BUILD_VERSION%" |
@ -0,0 +1,241 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||||
|
|
||||||
|
<!-- build targets --> |
||||||
|
<Target Name="Clean" DependsOnTargets="_CleanAll" /> |
||||||
|
<Target Name="BuildTools" DependsOnTargets="_BuildTools" /> |
||||||
|
<Target Name="GenerateProjects" DependsOnTargets="_GenerateProjects" /> |
||||||
|
<Target Name="GenerateSource" DependsOnTargets="_GenerateSource;_CopyGeneratedSource" /> |
||||||
|
<Target Name="RebuildSource" DependsOnTargets="Clean;BuildTools;GenerateSource" /> |
||||||
|
<Target Name="Build" DependsOnTargets="GenerateProjects;BuildTools;GenerateSource;_CompileAll" /> |
||||||
|
<Target Name="Rebuild" DependsOnTargets="Clean;Build" /> |
||||||
|
<Target Name="GeneratePackage" DependsOnTargets="_PackageAll;_GeneratePackage" /> |
||||||
|
<Target Name="FullBuild" DependsOnTargets="Rebuild;GeneratePackage" /> |
||||||
|
<!-- misc targets --> |
||||||
|
<Target Name="RunBenchmarks" DependsOnTargets="_CleanAll;_BuildTools;_RunBenchmarks" /> |
||||||
|
|
||||||
|
<PropertyGroup> |
||||||
|
<ProjectName>Protocol Buffers</ProjectName> |
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> |
||||||
|
<Platform Condition=" '$(Platform)' == '' ">Any CPU</Platform> |
||||||
|
|
||||||
|
<!--Directory Paths--> |
||||||
|
<ProjectDirectory>$(MSBuildProjectDirectory)\..</ProjectDirectory> |
||||||
|
<SourceDirectory>$(ProjectDirectory)\src</SourceDirectory> |
||||||
|
<LibDirectory>$(ProjectDirectory)\lib</LibDirectory> |
||||||
|
<ProtosDirectory>$(ProjectDirectory)\protos</ProtosDirectory> |
||||||
|
|
||||||
|
<SourceTempDirectory>$(ProjectDirectory)\build_temp\GeneratedSource</SourceTempDirectory> |
||||||
|
<BuildTempDirectory>$(ProjectDirectory)\build_temp</BuildTempDirectory> |
||||||
|
<BuildOutputDirectory>$(ProjectDirectory)\build_output</BuildOutputDirectory> |
||||||
|
<BuildOutputPackage>$(BuildOutputDirectory)</BuildOutputPackage> |
||||||
|
|
||||||
|
<BenchmarkArgs>/v2 /fast /formats</BenchmarkArgs> |
||||||
|
<BenchmarkOutputFile>$(BuildTempDirectory)\..\BenchmarkResults.txt</BenchmarkOutputFile> |
||||||
|
<BenchmarkProtosDirectory>$(ProjectDirectory)\benchmarks</BenchmarkProtosDirectory> |
||||||
|
|
||||||
|
<PackageName Condition=" '$(PackageName)' == '' ">$(Configuration)</PackageName> |
||||||
|
|
||||||
|
<!--Tool Paths--> |
||||||
|
<ProtocExePath>$(BuildOutputDirectory)\tools\protoc.exe</ProtocExePath> |
||||||
|
<ProtogenExePath>$(BuildOutputDirectory)\tools\protogen.exe</ProtogenExePath> |
||||||
|
<NUnitExePath>$(LibDirectory)\NUnit\tools\nunit-console.exe</NUnitExePath> |
||||||
|
<CsProjectProjector>$(LibDirectory)\CsProjectProjector\CsProjectProjector.exe</CsProjectProjector> |
||||||
|
<ZipExePath>$(LibDirectory)\7-Zip 9.20\7za.exe</ZipExePath> |
||||||
|
|
||||||
|
</PropertyGroup> |
||||||
|
|
||||||
|
<Import Project="Common.targets"/> |
||||||
|
|
||||||
|
<!-- Proto Files --> |
||||||
|
<ItemGroup> |
||||||
|
<Protos Include="$(ProtosDirectory)\extest\unittest_issues.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\extest\unittest_extras.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\extest\unittest_extras_full.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\extest\unittest_extras_lite.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\extest\unittest_extras_xmltest.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\extest\unittest_generic_services.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\extest\unittest_rpc_interop.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\extest\unittest_rpc_interop_lite.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\descriptor.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\csharp_options.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_csharp_options.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_custom_options.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_embed_optimize_for.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_empty.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_import.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_import_lite.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_lite.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_lite_imports_nonlite.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_mset.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_no_generic_services.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\protobuf\unittest_optimize_for.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\test\google_size.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\google\test\google_speed.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\tutorial\addressbook.proto" /> |
||||||
|
<!-- for benchmark --> |
||||||
|
<Protos Include="$(ProtosDirectory)\benchmarks\google_size.proto" /> |
||||||
|
<Protos Include="$(ProtosDirectory)\benchmarks\google_speed.proto" /> |
||||||
|
</ItemGroup> |
||||||
|
<!-- Generated Source --> |
||||||
|
<ItemGroup> |
||||||
|
<!-- Main protos --> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\CSharpOptions.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers\DescriptorProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\DescriptorProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers\DescriptorProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
|
||||||
|
<!-- Address book sample --> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\AddressBookProtos.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\AddressBook</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<!-- Unit test --> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasIssuesProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestXmlSerializerTestProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestCSharpOptionsProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestCustomOptionsProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestEmbedOptimizeForProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestEmptyProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportLiteProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestMessageSetProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestNoGenericServicesProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestOptimizeForProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestRpcInterop.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestRpcInteropLite.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestGenericServices.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<!-- Lite unit test --> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasFullProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasLiteProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportLiteProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestLiteImportNonLiteProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestLiteProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestGoogleSizeProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestGoogleSpeedProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\GoogleSizeProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\GoogleSpeedProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
<GeneratedSource Include="$(SourceTempDirectory)\UnitTestProtoFile.cs"> |
||||||
|
<TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory> |
||||||
|
</GeneratedSource> |
||||||
|
</ItemGroup> |
||||||
|
<!-- Package Items --> |
||||||
|
<ItemGroup> |
||||||
|
<StaticPackageItem Include="$(ProjectDirectory)\CHANGES.txt" /> |
||||||
|
<StaticPackageItem Include="$(ProjectDirectory)\license.txt" /> |
||||||
|
<StaticPackageItem Include="$(ProjectDirectory)\protos\google\protobuf\descriptor.proto"> |
||||||
|
<TargetDirectory>\protos\google\protobuf</TargetDirectory> |
||||||
|
</StaticPackageItem> |
||||||
|
<StaticPackageItem Include="$(ProjectDirectory)\protos\google\protobuf\compiler\plugin.proto"> |
||||||
|
<TargetDirectory>\protos\google\protobuf\compiler</TargetDirectory> |
||||||
|
</StaticPackageItem> |
||||||
|
<StaticPackageItem Include="$(ProjectDirectory)\protos\google\protobuf\csharp_options.proto"> |
||||||
|
<TargetDirectory>\protos\google\protobuf</TargetDirectory> |
||||||
|
</StaticPackageItem> |
||||||
|
<StaticPackageItem Include="$(ProjectDirectory)\protos\tutorial\addressbook.proto"> |
||||||
|
<TargetDirectory>\protos\tutorial</TargetDirectory> |
||||||
|
</StaticPackageItem> |
||||||
|
</ItemGroup> |
||||||
|
<!-- Tools --> |
||||||
|
<ItemGroup> |
||||||
|
<ToolsTestContainer Include="$(SourceDirectory)\ProtoGen.Test\bin\NET35\Release\Google.ProtocolBuffers.ProtoGen.Test.dll" /> |
||||||
|
|
||||||
|
<ToolsOutputItem Include="$(SourceDirectory)\ProtocolBuffers\bin\NET35\Release\Google.ProtocolBuffers.dll" /> |
||||||
|
<ToolsOutputItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\NET35\Release\Google.ProtocolBuffers.Serialization.dll" /> |
||||||
|
<ToolsOutputItem Include="$(SourceDirectory)\ProtoGen\bin\NET35\Release\ProtoGen.exe" /> |
||||||
|
<ToolsOutputItem Include="$(SourceDirectory)\ProtoGen\bin\NET35\Release\ProtoGen.exe.config" /> |
||||||
|
<ToolsOutputItem Include="$(SourceDirectory)\ProtoMunge\bin\NET35\Release\ProtoMunge.exe" /> |
||||||
|
<ToolsOutputItem Include="$(SourceDirectory)\ProtoDump\bin\NET35\Release\ProtoDump.exe" /> |
||||||
|
<ToolsOutputItem Include="$(SourceDirectory)\ProtoBench\bin\NET35\Release\ProtoBench.exe" /> |
||||||
|
<ToolsOutputItem Include="$(LibDirectory)\protoc.exe" /> |
||||||
|
<ToolsOutputItem Include="$(LibDirectory)\protoc-license.txt" /> |
||||||
|
</ItemGroup> |
||||||
|
<!-- Temporary Directories --> |
||||||
|
<ItemGroup> |
||||||
|
<TempBuildFolder Include="$(BuildTempDirectory)" /> |
||||||
|
<TempBuildFolder Include="$(BuildOutputDirectory)" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\AddressBook\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\AddressBook\bin" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoBench\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoBench\bin" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers\bin" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Serialization\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Test\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Test\bin" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffersLite.Test\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoDump\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoDump\bin" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoGen\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoGen\bin" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoGen.Test\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoGen.Test\bin" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoMunge\obj" /> |
||||||
|
<TempBuildFolder Include="$(SourceDirectory)\ProtoMunge\bin" /> |
||||||
|
</ItemGroup> |
||||||
|
</Project> |
@ -0,0 +1,248 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
# |
||||||
|
# Copyright 2006, 2007 Google Inc. All Rights Reserved. |
||||||
|
# Author: danderson@google.com (David Anderson) |
||||||
|
# |
||||||
|
# Script for uploading files to a Google Code project. |
||||||
|
# |
||||||
|
# This is intended to be both a useful script for people who want to |
||||||
|
# streamline project uploads and a reference implementation for |
||||||
|
# uploading files to Google Code projects. |
||||||
|
# |
||||||
|
# To upload a file to Google Code, you need to provide a path to the |
||||||
|
# file on your local machine, a small summary of what the file is, a |
||||||
|
# project name, and a valid account that is a member or owner of that |
||||||
|
# project. You can optionally provide a list of labels that apply to |
||||||
|
# the file. The file will be uploaded under the same name that it has |
||||||
|
# in your local filesystem (that is, the "basename" or last path |
||||||
|
# component). Run the script with '--help' to get the exact syntax |
||||||
|
# and available options. |
||||||
|
# |
||||||
|
# Note that the upload script requests that you enter your |
||||||
|
# googlecode.com password. This is NOT your Gmail account password! |
||||||
|
# This is the password you use on googlecode.com for committing to |
||||||
|
# Subversion and uploading files. You can find your password by going |
||||||
|
# to http://code.google.com/hosting/settings when logged in with your |
||||||
|
# Gmail account. If you have already committed to your project's |
||||||
|
# Subversion repository, the script will automatically retrieve your |
||||||
|
# credentials from there (unless disabled, see the output of '--help' |
||||||
|
# for details). |
||||||
|
# |
||||||
|
# If you are looking at this script as a reference for implementing |
||||||
|
# your own Google Code file uploader, then you should take a look at |
||||||
|
# the upload() function, which is the meat of the uploader. You |
||||||
|
# basically need to build a multipart/form-data POST request with the |
||||||
|
# right fields and send it to https://PROJECT.googlecode.com/files . |
||||||
|
# Authenticate the request using HTTP Basic authentication, as is |
||||||
|
# shown below. |
||||||
|
# |
||||||
|
# Licensed under the terms of the Apache Software License 2.0: |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Questions, comments, feature requests and patches are most welcome. |
||||||
|
# Please direct all of these to the Google Code users group: |
||||||
|
# http://groups.google.com/group/google-code-hosting |
||||||
|
|
||||||
|
"""Google Code file uploader script. |
||||||
|
""" |
||||||
|
|
||||||
|
__author__ = 'danderson@google.com (David Anderson)' |
||||||
|
|
||||||
|
import httplib |
||||||
|
import os.path |
||||||
|
import optparse |
||||||
|
import getpass |
||||||
|
import base64 |
||||||
|
import sys |
||||||
|
|
||||||
|
|
||||||
|
def upload(file, project_name, user_name, password, summary, labels=None): |
||||||
|
"""Upload a file to a Google Code project's file server. |
||||||
|
|
||||||
|
Args: |
||||||
|
file: The local path to the file. |
||||||
|
project_name: The name of your project on Google Code. |
||||||
|
user_name: Your Google account name. |
||||||
|
password: The googlecode.com password for your account. |
||||||
|
Note that this is NOT your global Google Account password! |
||||||
|
summary: A small description for the file. |
||||||
|
labels: an optional list of label strings with which to tag the file. |
||||||
|
|
||||||
|
Returns: a tuple: |
||||||
|
http_status: 201 if the upload succeeded, something else if an |
||||||
|
error occured. |
||||||
|
http_reason: The human-readable string associated with http_status |
||||||
|
file_url: If the upload succeeded, the URL of the file on Google |
||||||
|
Code, None otherwise. |
||||||
|
""" |
||||||
|
# The login is the user part of user@gmail.com. If the login provided |
||||||
|
# is in the full user@domain form, strip it down. |
||||||
|
if user_name.endswith('@gmail.com'): |
||||||
|
user_name = user_name[:user_name.index('@gmail.com')] |
||||||
|
|
||||||
|
form_fields = [('summary', summary)] |
||||||
|
if labels is not None: |
||||||
|
form_fields.extend([('label', l.strip()) for l in labels]) |
||||||
|
|
||||||
|
content_type, body = encode_upload_request(form_fields, file) |
||||||
|
|
||||||
|
upload_host = '%s.googlecode.com' % project_name |
||||||
|
upload_uri = '/files' |
||||||
|
auth_token = base64.b64encode('%s:%s'% (user_name, password)) |
||||||
|
headers = { |
||||||
|
'Authorization': 'Basic %s' % auth_token, |
||||||
|
'User-Agent': 'Googlecode.com uploader v0.9.4', |
||||||
|
'Content-Type': content_type, |
||||||
|
} |
||||||
|
|
||||||
|
server = httplib.HTTPSConnection(upload_host) |
||||||
|
server.request('POST', upload_uri, body, headers) |
||||||
|
resp = server.getresponse() |
||||||
|
server.close() |
||||||
|
|
||||||
|
if resp.status == 201: |
||||||
|
location = resp.getheader('Location', None) |
||||||
|
else: |
||||||
|
location = None |
||||||
|
return resp.status, resp.reason, location |
||||||
|
|
||||||
|
|
||||||
|
def encode_upload_request(fields, file_path): |
||||||
|
"""Encode the given fields and file into a multipart form body. |
||||||
|
|
||||||
|
fields is a sequence of (name, value) pairs. file is the path of |
||||||
|
the file to upload. The file will be uploaded to Google Code with |
||||||
|
the same file name. |
||||||
|
|
||||||
|
Returns: (content_type, body) ready for httplib.HTTP instance |
||||||
|
""" |
||||||
|
BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla' |
||||||
|
CRLF = '\r\n' |
||||||
|
|
||||||
|
body = [] |
||||||
|
|
||||||
|
# Add the metadata about the upload first |
||||||
|
for key, value in fields: |
||||||
|
body.extend( |
||||||
|
['--' + BOUNDARY, |
||||||
|
'Content-Disposition: form-data; name="%s"' % key, |
||||||
|
'', |
||||||
|
value, |
||||||
|
]) |
||||||
|
|
||||||
|
# Now add the file itself |
||||||
|
file_name = os.path.basename(file_path) |
||||||
|
f = open(file_path, 'rb') |
||||||
|
file_content = f.read() |
||||||
|
f.close() |
||||||
|
|
||||||
|
body.extend( |
||||||
|
['--' + BOUNDARY, |
||||||
|
'Content-Disposition: form-data; name="filename"; filename="%s"' |
||||||
|
% file_name, |
||||||
|
# The upload server determines the mime-type, no need to set it. |
||||||
|
'Content-Type: application/octet-stream', |
||||||
|
'', |
||||||
|
file_content, |
||||||
|
]) |
||||||
|
|
||||||
|
# Finalize the form body |
||||||
|
body.extend(['--' + BOUNDARY + '--', '']) |
||||||
|
|
||||||
|
return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body) |
||||||
|
|
||||||
|
|
||||||
|
def upload_find_auth(file_path, project_name, summary, labels=None, |
||||||
|
user_name=None, password=None, tries=3): |
||||||
|
"""Find credentials and upload a file to a Google Code project's file server. |
||||||
|
|
||||||
|
file_path, project_name, summary, and labels are passed as-is to upload. |
||||||
|
|
||||||
|
Args: |
||||||
|
file_path: The local path to the file. |
||||||
|
project_name: The name of your project on Google Code. |
||||||
|
summary: A small description for the file. |
||||||
|
labels: an optional list of label strings with which to tag the file. |
||||||
|
config_dir: Path to Subversion configuration directory, 'none', or None. |
||||||
|
user_name: Your Google account name. |
||||||
|
tries: How many attempts to make. |
||||||
|
""" |
||||||
|
|
||||||
|
while tries > 0: |
||||||
|
if user_name is None: |
||||||
|
# Read username if not specified or loaded from svn config, or on |
||||||
|
# subsequent tries. |
||||||
|
sys.stdout.write('Please enter your googlecode.com username: ') |
||||||
|
sys.stdout.flush() |
||||||
|
user_name = sys.stdin.readline().rstrip() |
||||||
|
if password is None: |
||||||
|
# Read password if not loaded from svn config, or on subsequent tries. |
||||||
|
print 'Please enter your googlecode.com password.' |
||||||
|
print '** Note that this is NOT your Gmail account password! **' |
||||||
|
print 'It is the password you use to access Subversion repositories,' |
||||||
|
print 'and can be found here: http://code.google.com/hosting/settings' |
||||||
|
password = getpass.getpass() |
||||||
|
|
||||||
|
status, reason, url = upload(file_path, project_name, user_name, password, |
||||||
|
summary, labels) |
||||||
|
# Returns 403 Forbidden instead of 401 Unauthorized for bad |
||||||
|
# credentials as of 2007-07-17. |
||||||
|
if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]: |
||||||
|
# Rest for another try. |
||||||
|
user_name = password = None |
||||||
|
tries = tries - 1 |
||||||
|
else: |
||||||
|
# We're done. |
||||||
|
break |
||||||
|
|
||||||
|
return status, reason, url |
||||||
|
|
||||||
|
|
||||||
|
def main(): |
||||||
|
parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY ' |
||||||
|
'-p PROJECT [options] FILE') |
||||||
|
parser.add_option('-s', '--summary', dest='summary', |
||||||
|
help='Short description of the file') |
||||||
|
parser.add_option('-p', '--project', dest='project', |
||||||
|
help='Google Code project name') |
||||||
|
parser.add_option('-u', '--user', dest='user', |
||||||
|
help='Your Google Code username') |
||||||
|
parser.add_option('-w', '--password', dest='password', |
||||||
|
help='Your Google Code password') |
||||||
|
parser.add_option('-l', '--labels', dest='labels', |
||||||
|
help='An optional list of comma-separated labels to attach ' |
||||||
|
'to the file') |
||||||
|
|
||||||
|
options, args = parser.parse_args() |
||||||
|
|
||||||
|
if not options.summary: |
||||||
|
parser.error('File summary is missing.') |
||||||
|
elif not options.project: |
||||||
|
parser.error('Project name is missing.') |
||||||
|
elif len(args) < 1: |
||||||
|
parser.error('File to upload not provided.') |
||||||
|
elif len(args) > 1: |
||||||
|
parser.error('Only one file may be specified.') |
||||||
|
|
||||||
|
file_path = args[0] |
||||||
|
|
||||||
|
if options.labels: |
||||||
|
labels = options.labels.split(',') |
||||||
|
else: |
||||||
|
labels = None |
||||||
|
|
||||||
|
status, reason, url = upload_find_auth(file_path, options.project, |
||||||
|
options.summary, labels, |
||||||
|
options.user, options.password) |
||||||
|
if url: |
||||||
|
print 'The file was uploaded successfully.' |
||||||
|
print 'URL: %s' % url |
||||||
|
return 0 |
||||||
|
else: |
||||||
|
print 'An error occurred. Your file was not uploaded.' |
||||||
|
print 'Google Code upload server said: %s (%s)' % (reason, status) |
||||||
|
return 1 |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
sys.exit(main()) |
@ -0,0 +1,79 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<!-- original location: https://hg01.codeplex.com/nuget/raw-file/tip/src/Core/Authoring/nuspec.xsd --> |
||||||
|
<xs:schema id="nuspec" xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
||||||
|
<xs:element name="package"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:sequence> |
||||||
|
<xs:element name="metadata" maxOccurs="1" minOccurs="1"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:all> |
||||||
|
<xs:element name="id" maxOccurs="1" minOccurs="1" type="xs:string" /> |
||||||
|
<xs:element name="version" maxOccurs="1" minOccurs="1" type="xs:string" /> |
||||||
|
<xs:element name="title" maxOccurs="1" minOccurs="0" type="xs:string" /> |
||||||
|
<xs:element name="authors" maxOccurs="1" minOccurs="1" type="xs:string" /> |
||||||
|
<xs:element name="owners" maxOccurs="1" minOccurs="0" type="xs:string" /> |
||||||
|
<xs:element name="licenseUrl" maxOccurs="1" minOccurs="0" type="xs:anyURI" /> |
||||||
|
<xs:element name="projectUrl" maxOccurs="1" minOccurs="0" type="xs:anyURI" /> |
||||||
|
<xs:element name="iconUrl" maxOccurs="1" minOccurs="0" type="xs:anyURI" /> |
||||||
|
<xs:element name="requireLicenseAcceptance" maxOccurs="1" minOccurs="0" type="xs:boolean" /> |
||||||
|
<xs:element name="description" maxOccurs="1" minOccurs="1" type="xs:string" /> |
||||||
|
<xs:element name="summary" maxOccurs="1" minOccurs="0" type="xs:string" /> |
||||||
|
<xs:element name="releaseNotes" maxOccurs="1" minOccurs="0" type="xs:string" /> |
||||||
|
<xs:element name="copyright" maxOccurs="1" minOccurs="0" type="xs:string" /> |
||||||
|
<xs:element name="language" maxOccurs="1" minOccurs="0" type="xs:string" default="en-US" /> |
||||||
|
<xs:element name="tags" maxOccurs="1" minOccurs="0" type="xs:string" /> |
||||||
|
<xs:element name="dependencies" maxOccurs="1" minOccurs="0"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:sequence> |
||||||
|
<xs:element name="dependency" minOccurs="0" maxOccurs="unbounded"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:attribute name="id" type="xs:string" use="required" /> |
||||||
|
<xs:attribute name="version" type="xs:string" use="optional" /> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
</xs:sequence> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
<xs:element name="frameworkAssemblies" maxOccurs="1" minOccurs="0"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:sequence> |
||||||
|
<xs:element name="frameworkAssembly" minOccurs="0" maxOccurs="unbounded"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:attribute name="assemblyName" type="xs:string" use="required" /> |
||||||
|
<xs:attribute name="targetFramework" type="xs:string" use="optional" /> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
</xs:sequence> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
<xs:element name="references" maxOccurs="1" minOccurs="0"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:sequence> |
||||||
|
<xs:element name="reference" minOccurs="0" maxOccurs="unbounded"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:attribute name="file" type="xs:string" use="required" /> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
</xs:sequence> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
</xs:all> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
<xs:element name="files" minOccurs="0" maxOccurs="1" nillable="true"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:sequence> |
||||||
|
<xs:element name="file" minOccurs="0" maxOccurs="unbounded"> |
||||||
|
<xs:complexType> |
||||||
|
<xs:attribute name="src" use="required" type="xs:string" /> |
||||||
|
<xs:attribute name="target" use="optional" type="xs:string" /> |
||||||
|
<xs:attribute name="exclude" use="optional" type="xs:string" /> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
</xs:sequence> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
</xs:sequence> |
||||||
|
</xs:complexType> |
||||||
|
</xs:element> |
||||||
|
</xs:schema> |
@ -0,0 +1,186 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<Project DefaultTargets="Publish" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||||
|
|
||||||
|
<!-- build targets --> |
||||||
|
<Target Name="Clean" DependsOnTargets="_Clean" /> |
||||||
|
<Target Name="Build" DependsOnTargets="_Clean;_Prerequisites;_StampVersion;_GenerateSource;_Build" /> |
||||||
|
<Target Name="Label" DependsOnTargets="_HgLabel" /> |
||||||
|
<Target Name="Package" DependsOnTargets="_HgPack;_NugetPack" /> |
||||||
|
<Target Name="Prepare" DependsOnTargets="Clean;Build;Label;Package" /> |
||||||
|
<Target Name="PushAll" DependsOnTargets="_HgPush;_NugetPush" /> |
||||||
|
<Target Name="Publish" DependsOnTargets="Prepare;PushAll" /> |
||||||
|
|
||||||
|
<PropertyGroup> |
||||||
|
<ProjectName>Protocol Buffers</ProjectName> |
||||||
|
<VersionMajor>2</VersionMajor> |
||||||
|
<VersionMinor>4</VersionMinor> |
||||||
|
<VersionBuild>1</VersionBuild> |
||||||
|
<VersionRevision></VersionRevision> |
||||||
|
<VersionLabel></VersionLabel> |
||||||
|
|
||||||
|
<PackagePrefix>protobuf-csharp-port-</PackagePrefix> |
||||||
|
<PublishDebug>false</PublishDebug> |
||||||
|
|
||||||
|
<GoogleUsername></GoogleUsername> |
||||||
|
<GooglePassword></GooglePassword> |
||||||
|
|
||||||
|
<!--Directory Paths--> |
||||||
|
<ProjectDirectory>$(MSBuildProjectDirectory)\..</ProjectDirectory> |
||||||
|
<BuildTempDirectory>$(ProjectDirectory)\build_temp</BuildTempDirectory> |
||||||
|
<BuildOutputDirectory>$(ProjectDirectory)\build_output</BuildOutputDirectory> |
||||||
|
<SourceDirectory>$(ProjectDirectory)\src</SourceDirectory> |
||||||
|
<LibDirectory>$(ProjectDirectory)\lib</LibDirectory> |
||||||
|
|
||||||
|
<!-- File Paths --> |
||||||
|
<SigningKey>$(ProjectDirectory)\release-key\Google.ProtocolBuffers.snk</SigningKey> |
||||||
|
|
||||||
|
<!--Tool Paths--> |
||||||
|
<HgTool>hg.exe</HgTool> |
||||||
|
<Python>C:\Python25\python.exe</Python> |
||||||
|
<SnTool>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A@InstallationFolder)Bin\sn.exe</SnTool> |
||||||
|
<StampVer>$(LibDirectory)\StampVersion.exe</StampVer> |
||||||
|
<ZipExePath>$(LibDirectory)\7-Zip 9.20\7za.exe</ZipExePath> |
||||||
|
<NuGet>$(LibDirectory)\NuGet.exe</NuGet> |
||||||
|
<ProtogenExePath>$(BuildOutputDirectory)\tools\protogen.exe</ProtogenExePath> |
||||||
|
</PropertyGroup> |
||||||
|
|
||||||
|
<!-- Import user settings --> |
||||||
|
<Import Project="$(MSBuildProjectFullPath).user" Condition="Exists('$(MSBuildProjectFullPath).user')" /> |
||||||
|
|
||||||
|
<!-- Files --> |
||||||
|
<ItemGroup> |
||||||
|
</ItemGroup> |
||||||
|
|
||||||
|
<!-- Tasks --> |
||||||
|
|
||||||
|
<Target Name="_Prerequisites" DependsOnTargets="_CheckEnvironment;_ReadVersion" /> |
||||||
|
|
||||||
|
<Target Name="_Clean"> |
||||||
|
<MSBuild Properties="Configuration=Debug;" Targets="Clean" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MSBuild Properties="Configuration=Release;" Targets="Clean" Projects="$(MSBuildProjectDirectory)\target.csproj" /> |
||||||
|
<MakeDir Directories="$(BuildTempDirectory)" /> |
||||||
|
<MakeDir Directories="$(BuildOutputDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_WriteUserConfig"> |
||||||
|
<ItemGroup> |
||||||
|
<Lines Include="<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>" /> |
||||||
|
<Lines Include=" <PropertyGroup>"/> |
||||||
|
<Lines Include=" <GoogleUsername> (Enter your google-code user/password here) </GoogleUsername>"/> |
||||||
|
<Lines Include=" <GooglePassword></GooglePassword>"/> |
||||||
|
<Lines Include=" </PropertyGroup>" /> |
||||||
|
<Lines Include="</Project>" /> |
||||||
|
</ItemGroup> |
||||||
|
<WriteLinesToFile File="$(MSBuildProjectFullPath).user" Lines="@(Lines)" Overwrite="true" Condition="!Exists('$(MSBuildProjectFullPath).user')" /> |
||||||
|
<Exec Command="Notepad.exe $(MSBuildProjectFullPath).user" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_CheckEnvironment"> |
||||||
|
<!-- Require google credentials --> |
||||||
|
<CallTarget Targets="_WriteUserConfig" Condition=" '$(GooglePassword)' == '' " /> |
||||||
|
<Error Text="Restart after you verify your credentials in $(MSBuildProjectFullPath).user" Condition=" '$(GooglePassword)' == '' " /> |
||||||
|
<!-- Require Win7.0A SDK to verify strong-name --> |
||||||
|
<Error Text="Unable to locate Win7SDK Tools: $(SnTool)" Condition="!Exists($(SnTool))" /> |
||||||
|
<!-- Require Python 2.5 installed --> |
||||||
|
<!-- Error Text="Unable to locate Python 2.5: $(Python)" Condition="!Exists($(Python))" / --> |
||||||
|
<!-- Require production signing key --> |
||||||
|
<Exec Command="$(HgTool) clone https://bitbucket.org/rknapp/protobuf-csharp-port-keyfile $(ProjectDirectory)\release-key" Condition="!Exists('$(SigningKey)')" /> |
||||||
|
<Error Text="Unable to locate release signing key: $(SigningKey)" Condition="!Exists($(SigningKey))" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_ReadVersion" Condition=" '$(VersionLabel)' == '' "> |
||||||
|
<Exec Command="$(HgTool) log -l 1 --template "{rev}" > "$(BuildTempDirectory)\revision.txt""></Exec> |
||||||
|
<ReadLinesFromFile File="$(BuildTempDirectory)\revision.txt"> |
||||||
|
<Output TaskParameter="Lines" PropertyName="VersionRevision"/> |
||||||
|
</ReadLinesFromFile> |
||||||
|
|
||||||
|
<PropertyGroup> |
||||||
|
<VersionLabel>$(VersionMajor).$(VersionMinor).$(VersionBuild).$(VersionRevision)</VersionLabel> |
||||||
|
</PropertyGroup> |
||||||
|
|
||||||
|
<Message Text="Building version $(VersionLabel)" Importance="high" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_StampVersion" DependsOnTargets="_Prerequisites"> |
||||||
|
<Exec Command="$(StampVer) /major:$(VersionMajor) /minor:$(VersionMinor) /build:$(VersionBuild) /revision:$(VersionRevision)" WorkingDirectory="$(SourceDirectory)" /> |
||||||
|
<Exec Command="FIND "$(VersionLabel)" ProtocolBuffers\Properties\AssemblyInfo.cs" WorkingDirectory="$(SourceDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_GenerateSource" DependsOnTargets="_Prerequisites"> |
||||||
|
<MSBuild Properties="Configuration=Release;AssemblyOriginatorKeyFile=$(SigningKey)" Targets="GenerateProjects;BuildTools;GenerateSource" Projects="$(MSBuildProjectDirectory)\build.csproj" /> |
||||||
|
<Exec Command=""$(SnTool)" -T "$(ProtogenExePath)" > signkey.txt" WorkingDirectory="$(BuildTempDirectory)" /> |
||||||
|
<!-- Make sure we are signing with the correct key --> |
||||||
|
<Exec Command="FIND "55f7125234beb589" signkey.txt" WorkingDirectory="$(BuildTempDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_Build" DependsOnTargets="_Prerequisites"> |
||||||
|
<!-- Release Build --> |
||||||
|
<MSBuild Properties="Configuration=Release;AssemblyOriginatorKeyFile=$(SigningKey)" Targets="_CompileAll" Projects="$(MSBuildProjectDirectory)\build.csproj" /> |
||||||
|
<MSBuild Properties="Configuration=Release;AssemblyOriginatorKeyFile=$(SigningKey);PackageName=$(PackagePrefix)$(VersionLabel)-release" Targets="GeneratePackage" Projects="$(MSBuildProjectDirectory)\build.csproj" /> |
||||||
|
<!-- Debug Build --> |
||||||
|
<MSBuild Condition=" '$(PublishDebug)' == 'true' " Properties="Configuration=Debug;AssemblyOriginatorKeyFile=$(SigningKey)" Targets="_CompileAll" Projects="$(MSBuildProjectDirectory)\build.csproj" /> |
||||||
|
<MSBuild Condition=" '$(PublishDebug)' == 'true' " Properties="Configuration=Debug;AssemblyOriginatorKeyFile=$(SigningKey);PackageName=$(PackagePrefix)$(VersionLabel)-full" Targets="GeneratePackage" Projects="$(MSBuildProjectDirectory)\build.csproj" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_HgPack" DependsOnTargets="_Prerequisites"> |
||||||
|
<Exec Command="$(HgTool) archive $(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-source.zip" WorkingDirectory="$(ProjectDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_HgLabel" DependsOnTargets="_Prerequisites"> |
||||||
|
<Exec Command="$(HgTool) commit -m "version $(VersionLabel)"" WorkingDirectory="$(ProjectDirectory)" /> |
||||||
|
<Exec Command="$(HgTool) tag $(VersionLabel)" WorkingDirectory="$(ProjectDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_HgPush" DependsOnTargets="_Prerequisites"> |
||||||
|
<Exec Command="$(HgTool) push" WorkingDirectory="$(ProjectDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_PkgPush" DependsOnTargets="_Prerequisites"> |
||||||
|
<PropertyGroup> |
||||||
|
<UploadPackage>$(Python) "$(MSBuildProjectDirectory)\googlecode_upload.py" --project protobuf-csharp-port --user "$(GoogleUsername)" --password "$(GooglePassword)"</UploadPackage> |
||||||
|
|
||||||
|
<SourcePackage>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-source.zip</SourcePackage> |
||||||
|
<ReleasePackageBin>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-release-binaries.zip</ReleasePackageBin> |
||||||
|
<ReleasePackageSyb>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-release-symbols.zip</ReleasePackageSyb> |
||||||
|
<DebugPackageBin>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-full-binaries.zip</DebugPackageBin> |
||||||
|
<DebugPackageSyb>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-full-symbols.zip</DebugPackageSyb> |
||||||
|
</PropertyGroup> |
||||||
|
|
||||||
|
<Error Condition="!Exists('$(SourcePackage)')" Text="File not found: $(SourcePackage)" /> |
||||||
|
<Error Condition="!Exists('$(ReleasePackageBin)')" Text="File not found: $(ReleasePackageBin)" /> |
||||||
|
<Error Condition="!Exists('$(ReleasePackageSyb)')" Text="File not found: $(ReleasePackageSyb)" /> |
||||||
|
<Error Condition="'$(PublishDebug)' == 'true' And !Exists('$(DebugPackageBin)')" Text="File not found: $(DebugPackageBin)" /> |
||||||
|
<Error Condition="'$(PublishDebug)' == 'true' And !Exists('$(DebugPackageSyb)')" Text="File not found: $(DebugPackageSyb)" /> |
||||||
|
|
||||||
|
<Exec WorkingDirectory="$(ProjectDirectory)" |
||||||
|
Command="$(UploadPackage) --labels Type-Source,Featured --summary "Version $(VersionLabel) source" $(SourcePackage)" /> |
||||||
|
|
||||||
|
<Exec WorkingDirectory="$(ProjectDirectory)" |
||||||
|
Command="$(UploadPackage) --labels Type-Executable,Featured --summary "Version $(VersionLabel) release binaries only" $(ReleasePackageBin)" /> |
||||||
|
<Exec WorkingDirectory="$(ProjectDirectory)" |
||||||
|
Command="$(UploadPackage) --labels Type-Executable,Featured --summary "Version $(VersionLabel) release binaries and symbols" $(ReleasePackageSyb)" /> |
||||||
|
|
||||||
|
<Exec WorkingDirectory="$(ProjectDirectory)" Condition=" '$(PublishDebug)' == 'true' " |
||||||
|
Command="$(UploadPackage) --labels Type-Executable,Featured --summary "Version $(VersionLabel) all binaries" $(DebugPackageBin)" /> |
||||||
|
<Exec WorkingDirectory="$(ProjectDirectory)" Condition=" '$(PublishDebug)' == 'true' " |
||||||
|
Command="$(UploadPackage) --labels Type-Executable,Featured --summary "Version $(VersionLabel) all binaries and symbols" $(DebugPackageSyb)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_NugetPack" DependsOnTargets="_Prerequisites"> |
||||||
|
<Exec WorkingDirectory="$(MSBuildProjectDirectory)" |
||||||
|
Command="$(NuGet) update -self" /> |
||||||
|
<Exec WorkingDirectory="$(MSBuildProjectDirectory)" |
||||||
|
Command="$(NuGet) pack Google.ProtocolBuffers.nuspec -Symbols -Version $(VersionLabel) -NoPackageAnalysis -OutputDirectory $(BuildTempDirectory)" /> |
||||||
|
<Exec WorkingDirectory="$(MSBuildProjectDirectory)" |
||||||
|
Command="$(NuGet) pack Google.ProtocolBuffersLite.nuspec -Symbols -Version $(VersionLabel) -NoPackageAnalysis -OutputDirectory $(BuildTempDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_NugetPush" DependsOnTargets="_Prerequisites"> |
||||||
|
<Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffers.$(VersionLabel).nupkg" ContinueOnError="true" /> |
||||||
|
<Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffersLite.$(VersionLabel).nupkg" ContinueOnError="true" /> |
||||||
|
|
||||||
|
<Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffers.$(VersionLabel).symbols.nupkg" ContinueOnError="true" /> |
||||||
|
<Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffersLite.$(VersionLabel).symbols.nupkg" ContinueOnError="true" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
</Project> |
@ -0,0 +1,167 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
High-level Targets |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<Target Name="Clean" DependsOnTargets="_Clean" /> |
||||||
|
<Target Name="Build" DependsOnTargets="_Compile;_Test" /> |
||||||
|
<Target Name="Test" DependsOnTargets="_Test" /> |
||||||
|
<Target Name="Rebuild" DependsOnTargets="Clean;Build" /> |
||||||
|
<Target Name="Publish" DependsOnTargets="Clean;Build;_Publish" /> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Properties |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<PropertyGroup> |
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
||||||
|
<Platform Condition=" '$(Platform)' == '' ">Any CPU</Platform> |
||||||
|
<TargetVersion Condition=" '$(TargetVersion)' == '' ">NET20</TargetVersion> |
||||||
|
<BuildParams></BuildParams> |
||||||
|
|
||||||
|
<!--Directory Paths--> |
||||||
|
<ProjectDirectory>$(MSBuildProjectDirectory)\..</ProjectDirectory> |
||||||
|
<SourceDirectory>$(ProjectDirectory)\src</SourceDirectory> |
||||||
|
<LibDirectory>$(ProjectDirectory)\lib</LibDirectory> |
||||||
|
|
||||||
|
<!--File Paths--> |
||||||
|
<BuildTempDirectory>$(ProjectDirectory)\build_temp\$(Configuration)\$(TargetVersion)</BuildTempDirectory> |
||||||
|
<BuildOutputDirectory>$(ProjectDirectory)\build_output\$(Configuration)\$(TargetVersion)</BuildOutputDirectory> |
||||||
|
<SolutionFile>$(SourceDirectory)\ProtocolBuffersLibrary.$(TargetVersion).sln</SolutionFile> |
||||||
|
|
||||||
|
<!--Tool Paths--> |
||||||
|
<NUnitExePath>$(LibDirectory)\NUnit\tools\nunit-console.exe</NUnitExePath> |
||||||
|
<StatLightExePath>$(LibDirectory)\StatLight\tools\StatLight.exe</StatLightExePath> |
||||||
|
</PropertyGroup> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Target Versions |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<PropertyGroup Condition=" '$(TargetVersion)' == 'NET20' "> |
||||||
|
<BuildTools>3.5</BuildTools> |
||||||
|
<TestFramework>NUNIT</TestFramework> |
||||||
|
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(TargetVersion)' == 'NET35' "> |
||||||
|
<BuildTools>3.5</BuildTools> |
||||||
|
<TestFramework>NUNIT</TestFramework> |
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(TargetVersion)' == 'NET40' "> |
||||||
|
<BuildTools>4.0</BuildTools> |
||||||
|
<TestFramework>NUNIT</TestFramework> |
||||||
|
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(TargetVersion)' == 'CF20' "> |
||||||
|
<BuildTools>3.5</BuildTools> |
||||||
|
<TestFramework>NONE</TestFramework> |
||||||
|
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(TargetVersion)' == 'CF35' "> |
||||||
|
<BuildTools>3.5</BuildTools> |
||||||
|
<TestFramework>NONE</TestFramework> |
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(TargetVersion)' == 'SL20' "> |
||||||
|
<BuildTools>3.5</BuildTools> |
||||||
|
<TestFramework>SILVERLIGHT</TestFramework> |
||||||
|
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(TargetVersion)' == 'SL30' "> |
||||||
|
<BuildTools>3.5</BuildTools> |
||||||
|
<TestFramework>SILVERLIGHT</TestFramework> |
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(TargetVersion)' == 'SL40' "> |
||||||
|
<BuildTools>4.0</BuildTools> |
||||||
|
<TestFramework>SILVERLIGHT</TestFramework> |
||||||
|
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(TargetVersion)' == 'PL40' "> |
||||||
|
<BuildTools>4.0</BuildTools> |
||||||
|
<TestFramework>SILVERLIGHT</TestFramework> |
||||||
|
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
||||||
|
<BuildOutputDirectory>$(ProjectDirectory)\build_output\$(Configuration)\portable-net40+sl4+sl5+wp7+wp8+win8</BuildOutputDirectory> |
||||||
|
</PropertyGroup> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
File Groups |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<ItemGroup> |
||||||
|
<WorkingDirectories Include="$(BuildTempDirectory)" /> |
||||||
|
<WorkingDirectories Include="$(BuildOutputDirectory)" /> |
||||||
|
|
||||||
|
<TestContainer Include="$(SourceDirectory)\ProtocolBuffers.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Test.dll" /> |
||||||
|
<TestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Test.dll" /> |
||||||
|
<TestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersMixedLite.Test.dll" /> |
||||||
|
|
||||||
|
<StatLightTestContainer Include="$(SourceDirectory)\ProtocolBuffers.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Test.xap" /> |
||||||
|
<StatLightTestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Test.xap" /> |
||||||
|
<StatLightTestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersMixedLite.Test.xap" /> |
||||||
|
|
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.dll" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.pdb" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.xml" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.dll" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.pdb" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.xml" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Serialization.dll" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Serialization.pdb" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Serialization.xml" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Serialization.dll" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Serialization.pdb" /> |
||||||
|
<PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Serialization.xml" /> |
||||||
|
</ItemGroup> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Targets For Build |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<Target Name="_Configured"> |
||||||
|
<Message Text="Building $(TargetVersion) for configuration $(Configuration), platform $(Platform)" Importance="normal" /> |
||||||
|
<Error Text="Unknown or missing value for TargetVersion=[value]" Condition=" '$(BuildTools)' == '' " /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_Clean" DependsOnTargets="_Configured"> |
||||||
|
<RemoveDir Directories="@(WorkingDirectories)" Condition="Exists(%(WorkingDirectories.Identity))" /> |
||||||
|
<MSBuild Targets="Clean" Projects="$(SolutionFile)" ToolsVersion="$(BuildTools)" |
||||||
|
Properties="Configuration=$(Configuration);Platform=$(Platform);" |
||||||
|
/> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_Compile" DependsOnTargets="_Configured"> |
||||||
|
<MSBuild Targets="Build" Projects="$(SolutionFile)" ToolsVersion="$(BuildTools)" |
||||||
|
Properties="Configuration=$(Configuration);Platform=$(Platform);$(BuildParams)" |
||||||
|
/> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_Publish" DependsOnTargets="_Configured"> |
||||||
|
<MakeDir Directories="$(BuildOutputDirectory)" /> |
||||||
|
<Copy SourceFiles="@(PublishItem)" DestinationFolder="$(BuildOutputDirectory)" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<!-- ********************************************************************************************** |
||||||
|
Targets For Test |
||||||
|
*********************************************************************************************** --> |
||||||
|
|
||||||
|
<Target Name="_Test" DependsOnTargets="_Configured"> |
||||||
|
<MakeDir Directories="$(BuildTempDirectory)" /> |
||||||
|
<CallTarget Targets="_RunNunit" Condition=" '$(TestFramework)'=='NUNIT' " /> |
||||||
|
<CallTarget Targets="_RunStatLight" Condition=" '$(TestFramework)'=='SILVERLIGHT' " /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_RunNunit"> |
||||||
|
<Copy SourceFiles="$(LibDirectory)\NUnit-config\nunit-console.$(TargetFrameworkVersion).config" DestinationFiles="$(NUnitExePath).config" /> |
||||||
|
<Exec Command=""$(NUnitExePath)" /nologo /noshadow "%(TestContainer.Identity)" /xml:"$(BuildTempDirectory)\%(TestContainer.Filename).xml"" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
<Target Name="_RunStatLight"> |
||||||
|
<Exec |
||||||
|
Command=""$(StatLightExePath)" -x %(StatLightTestContainer.Identity) --ReportOutputFileType=NUnit --ReportOutputFile=$(BuildTempDirectory)\%(StatLightTestContainer.Filename).xml" /> |
||||||
|
</Target> |
||||||
|
|
||||||
|
</Project> |
Binary file not shown.
@ -0,0 +1,13 @@ |
|||||||
|
@ECHO OFF |
||||||
|
IF EXIST "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe" GOTO FOUND |
||||||
|
goto USEPATH |
||||||
|
|
||||||
|
:FOUND |
||||||
|
"C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe" -k %~dp0\Google.ProtocolBuffers.snk |
||||||
|
GOTO EXIT |
||||||
|
|
||||||
|
:USEPATH |
||||||
|
sn.exe -k %~dp0\Google.ProtocolBuffers.snk |
||||||
|
GOTO EXIT |
||||||
|
|
||||||
|
:EXIT |
@ -0,0 +1,18 @@ |
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?> |
||||||
|
<configuration> |
||||||
|
|
||||||
|
<startup> |
||||||
|
<requiredRuntime version="v2.0.50727" /> |
||||||
|
</startup> |
||||||
|
|
||||||
|
<runtime> |
||||||
|
<!-- We need this so test exceptions don't crash NUnit --> |
||||||
|
<legacyUnhandledExceptionPolicy enabled="1" /> |
||||||
|
|
||||||
|
<!-- Look for addins in the addins directory for now --> |
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> |
||||||
|
<probing privatePath="lib;addins"/> |
||||||
|
</assemblyBinding> |
||||||
|
</runtime> |
||||||
|
|
||||||
|
</configuration> |
@ -0,0 +1,18 @@ |
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?> |
||||||
|
<configuration> |
||||||
|
|
||||||
|
<startup> |
||||||
|
<requiredRuntime version="v2.0.50727" /> |
||||||
|
</startup> |
||||||
|
|
||||||
|
<runtime> |
||||||
|
<!-- We need this so test exceptions don't crash NUnit --> |
||||||
|
<legacyUnhandledExceptionPolicy enabled="1" /> |
||||||
|
|
||||||
|
<!-- Look for addins in the addins directory for now --> |
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> |
||||||
|
<probing privatePath="lib;addins"/> |
||||||
|
</assemblyBinding> |
||||||
|
</runtime> |
||||||
|
|
||||||
|
</configuration> |
@ -0,0 +1,18 @@ |
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?> |
||||||
|
<configuration> |
||||||
|
|
||||||
|
<startup useLegacyV2RuntimeActivationPolicy="true"> |
||||||
|
<requiredRuntime version="v4.0.30319" safemode="true"/> |
||||||
|
</startup> |
||||||
|
|
||||||
|
<runtime> |
||||||
|
<!-- We need this so test exceptions don't crash NUnit --> |
||||||
|
<legacyUnhandledExceptionPolicy enabled="1" /> |
||||||
|
|
||||||
|
<!-- Look for addins in the addins directory for now --> |
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> |
||||||
|
<probing privatePath="lib;addins"/> |
||||||
|
</assemblyBinding> |
||||||
|
</runtime> |
||||||
|
|
||||||
|
</configuration> |
@ -0,0 +1,13 @@ |
|||||||
|
This directory used to contain the binary dependencies, but they were removed during a cleanup associated with importing the project |
||||||
|
into google/protobuf repository. Before we figure a better way to manage the dependencies, you will have to manually download the dependencies |
||||||
|
to be able to build the test projects: |
||||||
|
|
||||||
|
1. Download https://github.com/jskeet/protobuf-csharp-port/archive/2.4.1.555.zip |
||||||
|
2. Open the archive and copy following files into this directory: |
||||||
|
* `lib/Microsoft.Silverlight.Testing/` |
||||||
|
* `lib/NUnit/` |
||||||
|
* `lib/proto.exe` |
||||||
|
|
||||||
|
After that, you should be able to fully build the C# protobufs Visual Studio solutions. |
||||||
|
|
||||||
|
TODO(jtattermusch): the way we pull in dependencies needs to change |
@ -0,0 +1,37 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
# Adjust these to reflect the location of NUnit in your system, |
||||||
|
# and how you want NUnit to run |
||||||
|
NUNIT=~/protobuf/NUnit-2.5.0.9122/bin/net-2.0/nunit-console.exe |
||||||
|
NUNIT_OPTIONS=-noshadow |
||||||
|
|
||||||
|
# The rest should be okay. |
||||||
|
|
||||||
|
SRC=../src |
||||||
|
LIB=../lib |
||||||
|
KEYFILE=../keys/Google.ProtocolBuffers.snk |
||||||
|
|
||||||
|
rm -rf bin |
||||||
|
mkdir bin |
||||||
|
|
||||||
|
# Running the unit tests requires the dependencies are |
||||||
|
# in the bin directory too |
||||||
|
cp -f $LIB/{Rhino.Mocks.dll,nunit.framework.dll} bin |
||||||
|
|
||||||
|
echo Building main library |
||||||
|
gmcs -target:library -out:bin/Google.ProtocolBuffers.dll `find $SRC/ProtocolBuffers -name '*.cs'` -keyfile:$KEYFILE |
||||||
|
|
||||||
|
echo Building main library tests |
||||||
|
gmcs -target:library -out:bin/Google.ProtocolBuffers.Test.dll `find $SRC/ProtocolBuffers.Test -name '*.cs'` -keyfile:$KEYFILE -r:bin/Google.ProtocolBuffers.dll -r:$LIB/nunit.framework.dll -r:$LIB/Rhino.Mocks.dll |
||||||
|
|
||||||
|
echo Running main library tests |
||||||
|
mono $NUNIT bin/Google.ProtocolBuffers.Test.dll $NUNIT_OPTIONS |
||||||
|
|
||||||
|
echo Building ProtoGen |
||||||
|
gmcs -target:exe -out:bin/ProtoGen.exe `find $SRC/ProtoGen -name '*.cs'` -keyfile:$KEYFILE -r:bin/Google.ProtocolBuffers.dll |
||||||
|
|
||||||
|
echo Building ProtoGen tests |
||||||
|
gmcs -target:library -out:bin/Google.ProtocolBuffers.ProtoGen.Test.dll `find $SRC/ProtoGen.Test -name '*.cs'` -keyfile:$KEYFILE -r:bin/Google.ProtocolBuffers.dll -r:$LIB/nunit.framework.dll -r:bin/ProtoGen.exe |
||||||
|
|
||||||
|
echo Running ProtoGen tests |
||||||
|
mono $NUNIT bin/Google.ProtocolBuffers.ProtoGen.Test.dll $NUNIT_OPTIONS |
@ -0,0 +1,29 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
echo Compiling protobufs |
||||||
|
rm -rf tmp |
||||||
|
mkdir tmp |
||||||
|
PROTOS_DIR=../protos |
||||||
|
|
||||||
|
./protoc --proto_path=$PROTOS_DIR --descriptor_set_out=tmp/compiled.pb \ |
||||||
|
$PROTOS_DIR/google/protobuf/descriptor.proto \ |
||||||
|
$PROTOS_DIR/google/protobuf/csharp_options.proto \ |
||||||
|
$PROTOS_DIR/google/protobuf/unittest.proto \ |
||||||
|
$PROTOS_DIR/google/protobuf/unittest_csharp_options.proto \ |
||||||
|
$PROTOS_DIR/google/protobuf/unittest_custom_options.proto \ |
||||||
|
$PROTOS_DIR/google/protobuf/unittest_embed_optimize_for.proto \ |
||||||
|
$PROTOS_DIR/google/protobuf/unittest_import.proto \ |
||||||
|
$PROTOS_DIR/google/protobuf/unittest_mset.proto \ |
||||||
|
$PROTOS_DIR/google/protobuf/unittest_optimize_for.proto \ |
||||||
|
$PROTOS_DIR/tutorial/addressbook.proto |
||||||
|
|
||||||
|
cd tmp |
||||||
|
echo Generating new source |
||||||
|
mono ../bin/ProtoGen.exe compiled.pb |
||||||
|
|
||||||
|
echo Copying source into place |
||||||
|
cp DescriptorProtoFile.cs CSharpOptions.cs ../../src/ProtocolBuffers/DescriptorProtos |
||||||
|
cp UnitTest*.cs ../../src/ProtocolBuffers.Test/TestProtos |
||||||
|
cp AddressBookProtos.cs ../../src/AddressBook |
||||||
|
cd .. |
||||||
|
rm -rf tmp |
@ -0,0 +1,91 @@ |
|||||||
|
Getting started with Protocol Buffers on Mono |
||||||
|
--------------------------------------------- |
||||||
|
|
||||||
|
Prerequisites: |
||||||
|
|
||||||
|
o Mono 2.4 or higher. Earlier versions of Mono had too |
||||||
|
many issues with the weird and wonderful generic type |
||||||
|
relationships in Protocol Buffers. (Even Mono 2.4 *did* |
||||||
|
have a few compile-time problems, but I've worked round them.) |
||||||
|
|
||||||
|
o Some sort of Linux/Unix system |
||||||
|
You can try running with Bash on Windows via MINGW32 or |
||||||
|
something similar, but you're on your own :) It's easier |
||||||
|
to build and test everything with .NET if you're on |
||||||
|
Windows. |
||||||
|
|
||||||
|
o The native Protocol Buffers build for your system. |
||||||
|
Get it from http://code.google.com/p/protobuf/ |
||||||
|
After building it, copy the executable protoc |
||||||
|
file into this directory. |
||||||
|
|
||||||
|
o The NUnit binaries from http://nunit.org |
||||||
|
I generally just download the latest version, which |
||||||
|
may not be the one which goes with nunit.framework.dll |
||||||
|
in ../lib, but I've never found this to be a problem. |
||||||
|
|
||||||
|
Building the code with current sources |
||||||
|
-------------------------------------- |
||||||
|
|
||||||
|
1) Edit buildall.sh to tell it where to find nunit-console.exe |
||||||
|
(and possibly change other options) |
||||||
|
|
||||||
|
2) Run buildall.sh from this directory. It should build the |
||||||
|
main library code + tests and ProtoGen code + tests, running |
||||||
|
each set of tests after building it. |
||||||
|
|
||||||
|
Note that currently one test is ignored in ServiceTest.cs. This |
||||||
|
made the Mono VM blow up - I suspect it's some interaction with |
||||||
|
Rhino which doesn't quite work on Mono 2.4. If you want to see a |
||||||
|
truly nasty stack trace, just comment out the Ignore attribute in |
||||||
|
ServiceTest.cs and rerun. |
||||||
|
|
||||||
|
The binaries will be produced in a bin directory under this one. The |
||||||
|
build currently starts from scratch each time, cleaning out the bin |
||||||
|
directory first. Once I've decided on a full NAnt or xbuild |
||||||
|
strategy, I'll do something a little cleaner. |
||||||
|
|
||||||
|
Rebuilding sources for generated code |
||||||
|
------------------------------------- |
||||||
|
|
||||||
|
1) Build the current code first. The bootstrapping issue is why |
||||||
|
the generated source code is in the source repository :) See |
||||||
|
the steps above. |
||||||
|
|
||||||
|
2) Run generatesource.sh from this directory. This will create a |
||||||
|
temporary directory, compile the .proto files into a binary |
||||||
|
format, then run ProtoGen to generate .cs files from the binary |
||||||
|
format. It will copy these files to the right places in the tree, |
||||||
|
and finally delete the temporary directory. |
||||||
|
|
||||||
|
3) Rebuild to test that your newly generated sources work. (Optionally |
||||||
|
regenerate as well, and hash the generated files to check that |
||||||
|
the new build generates the same code as the old build :) |
||||||
|
|
||||||
|
Running the code |
||||||
|
---------------- |
||||||
|
|
||||||
|
Once you've built the binaries, you should be able to use them just |
||||||
|
as if you'd built them with .NET. (And indeed, you should be able to |
||||||
|
use binaries built with .NET as if you'd built them with Mono :) |
||||||
|
|
||||||
|
See the getting started guide for more information: |
||||||
|
http://code.google.com/p/protobuf-csharp-port/wiki/GettingStarted |
||||||
|
|
||||||
|
FAQ (Frequently Anticipated Questions) |
||||||
|
-------------------------------------- |
||||||
|
|
||||||
|
Q) This build process sucks! Why aren't you doing X, Y, Z? |
||||||
|
A) My Mono skills are limited. My NAnt skills are limited. My |
||||||
|
MSBuild/xbuild skils are limited. My shell script skills are |
||||||
|
limited. Any help is *very* welcome! |
||||||
|
|
||||||
|
Q) Why doesn't it build ProtoBench etc? |
||||||
|
A) This is a first initial "release" I'll add more bits to |
||||||
|
the build script. I'll be interested to see the results |
||||||
|
of benchmarking it on Mono :) |
||||||
|
|
||||||
|
Any further questions or suggestions? Please email skeet@pobox.com |
||||||
|
or leave a request at |
||||||
|
http://code.google.com/p/protobuf-csharp-port/issues/list |
||||||
|
|
@ -0,0 +1,140 @@ |
|||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.ProtoBench"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "GoogleSizeProtoFile"; |
||||||
|
|
||||||
|
package benchmarks; |
||||||
|
|
||||||
|
option java_outer_classname = "GoogleSize"; |
||||||
|
option optimize_for = CODE_SIZE; |
||||||
|
|
||||||
|
message SizeMessage1 { |
||||||
|
required string field1 = 1; |
||||||
|
optional string field9 = 9; |
||||||
|
optional string field18 = 18; |
||||||
|
optional bool field80 = 80 [default=false]; |
||||||
|
optional bool field81 = 81 [default=true]; |
||||||
|
required int32 field2 = 2; |
||||||
|
required int32 field3 = 3; |
||||||
|
optional int32 field280 = 280; |
||||||
|
optional int32 field6 = 6 [default=0]; |
||||||
|
optional int64 field22 = 22; |
||||||
|
optional string field4 = 4; |
||||||
|
repeated fixed64 field5 = 5; |
||||||
|
optional bool field59 = 59 [default=false]; |
||||||
|
optional string field7 = 7; |
||||||
|
optional int32 field16 = 16; |
||||||
|
optional int32 field130 = 130 [default=0]; |
||||||
|
optional bool field12 = 12 [default=true]; |
||||||
|
optional bool field17 = 17 [default=true]; |
||||||
|
optional bool field13 = 13 [default=true]; |
||||||
|
optional bool field14 = 14 [default=true]; |
||||||
|
optional int32 field104 = 104 [default=0]; |
||||||
|
optional int32 field100 = 100 [default=0]; |
||||||
|
optional int32 field101 = 101 [default=0]; |
||||||
|
optional string field102 = 102; |
||||||
|
optional string field103 = 103; |
||||||
|
optional int32 field29 = 29 [default=0]; |
||||||
|
optional bool field30 = 30 [default=false]; |
||||||
|
optional int32 field60 = 60 [default=-1]; |
||||||
|
optional int32 field271 = 271 [default=-1]; |
||||||
|
optional int32 field272 = 272 [default=-1]; |
||||||
|
optional int32 field150 = 150; |
||||||
|
optional int32 field23 = 23 [default=0]; |
||||||
|
optional bool field24 = 24 [default=false]; |
||||||
|
optional int32 field25 = 25 [default=0]; |
||||||
|
optional SizeMessage1SubMessage field15 = 15; |
||||||
|
optional bool field78 = 78; |
||||||
|
optional int32 field67 = 67 [default=0]; |
||||||
|
optional int32 field68 = 68; |
||||||
|
optional int32 field128 = 128 [default=0]; |
||||||
|
optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; |
||||||
|
optional int32 field131 = 131 [default=0]; |
||||||
|
} |
||||||
|
|
||||||
|
message SizeMessage1SubMessage { |
||||||
|
optional int32 field1 = 1 [default=0]; |
||||||
|
optional int32 field2 = 2 [default=0]; |
||||||
|
optional int32 field3 = 3 [default=0]; |
||||||
|
optional string field15 = 15; |
||||||
|
optional bool field12 = 12 [default=true]; |
||||||
|
optional int64 field13 = 13; |
||||||
|
optional int64 field14 = 14; |
||||||
|
optional int32 field16 = 16; |
||||||
|
optional int32 field19 = 19 [default=2]; |
||||||
|
optional bool field20 = 20 [default=true]; |
||||||
|
optional bool field28 = 28 [default=true]; |
||||||
|
optional fixed64 field21 = 21; |
||||||
|
optional int32 field22 = 22; |
||||||
|
optional bool field23 = 23 [ default=false ]; |
||||||
|
optional bool field206 = 206 [default=false]; |
||||||
|
optional fixed32 field203 = 203; |
||||||
|
optional int32 field204 = 204; |
||||||
|
optional string field205 = 205; |
||||||
|
optional uint64 field207 = 207; |
||||||
|
optional uint64 field300 = 300; |
||||||
|
} |
||||||
|
|
||||||
|
message SizeMessage2 { |
||||||
|
optional string field1 = 1; |
||||||
|
optional int64 field3 = 3; |
||||||
|
optional int64 field4 = 4; |
||||||
|
optional int64 field30 = 30; |
||||||
|
optional bool field75 = 75 [default=false]; |
||||||
|
optional string field6 = 6; |
||||||
|
optional bytes field2 = 2; |
||||||
|
optional int32 field21 = 21 [default=0]; |
||||||
|
optional int32 field71 = 71; |
||||||
|
optional float field25 = 25; |
||||||
|
optional int32 field109 = 109 [default=0]; |
||||||
|
optional int32 field210 = 210 [default=0]; |
||||||
|
optional int32 field211 = 211 [default=0]; |
||||||
|
optional int32 field212 = 212 [default=0]; |
||||||
|
optional int32 field213 = 213 [default=0]; |
||||||
|
optional int32 field216 = 216 [default=0]; |
||||||
|
optional int32 field217 = 217 [default=0]; |
||||||
|
optional int32 field218 = 218 [default=0]; |
||||||
|
optional int32 field220 = 220 [default=0]; |
||||||
|
optional int32 field221 = 221 [default=0]; |
||||||
|
optional float field222 = 222 [default=0.0]; |
||||||
|
optional int32 field63 = 63; |
||||||
|
|
||||||
|
repeated group Group1 = 10 { |
||||||
|
required float field11 = 11; |
||||||
|
optional float field26 = 26; |
||||||
|
optional string field12 = 12; |
||||||
|
optional string field13 = 13; |
||||||
|
repeated string field14 = 14; |
||||||
|
required uint64 field15 = 15; |
||||||
|
optional int32 field5 = 5; |
||||||
|
optional string field27 = 27; |
||||||
|
optional int32 field28 = 28; |
||||||
|
optional string field29 = 29; |
||||||
|
optional string field16 = 16; |
||||||
|
repeated string field22 = 22; |
||||||
|
repeated int32 field73 = 73; |
||||||
|
optional int32 field20 = 20 [default=0]; |
||||||
|
optional string field24 = 24; |
||||||
|
optional SizeMessage2GroupedMessage field31 = 31; |
||||||
|
} |
||||||
|
repeated string field128 = 128; |
||||||
|
optional int64 field131 = 131; |
||||||
|
repeated string field127 = 127; |
||||||
|
optional int32 field129 = 129; |
||||||
|
repeated int64 field130 = 130; |
||||||
|
optional bool field205 = 205 [default=false]; |
||||||
|
optional bool field206 = 206 [default=false]; |
||||||
|
} |
||||||
|
|
||||||
|
message SizeMessage2GroupedMessage { |
||||||
|
optional float field1 = 1; |
||||||
|
optional float field2 = 2; |
||||||
|
optional float field3 = 3 [default=0.0]; |
||||||
|
optional bool field4 = 4; |
||||||
|
optional bool field5 = 5; |
||||||
|
optional bool field6 = 6 [default=true]; |
||||||
|
optional bool field7 = 7 [default=false]; |
||||||
|
optional float field8 = 8; |
||||||
|
optional bool field9 = 9; |
||||||
|
optional float field10 = 10; |
||||||
|
optional int64 field11 = 11; |
||||||
|
} |
@ -0,0 +1,140 @@ |
|||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.ProtoBench"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "GoogleSpeedProtoFile"; |
||||||
|
|
||||||
|
package benchmarks; |
||||||
|
|
||||||
|
option java_outer_classname = "GoogleSpeed"; |
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
message SpeedMessage1 { |
||||||
|
required string field1 = 1; |
||||||
|
optional string field9 = 9; |
||||||
|
optional string field18 = 18; |
||||||
|
optional bool field80 = 80 [default=false]; |
||||||
|
optional bool field81 = 81 [default=true]; |
||||||
|
required int32 field2 = 2; |
||||||
|
required int32 field3 = 3; |
||||||
|
optional int32 field280 = 280; |
||||||
|
optional int32 field6 = 6 [default=0]; |
||||||
|
optional int64 field22 = 22; |
||||||
|
optional string field4 = 4; |
||||||
|
repeated fixed64 field5 = 5; |
||||||
|
optional bool field59 = 59 [default=false]; |
||||||
|
optional string field7 = 7; |
||||||
|
optional int32 field16 = 16; |
||||||
|
optional int32 field130 = 130 [default=0]; |
||||||
|
optional bool field12 = 12 [default=true]; |
||||||
|
optional bool field17 = 17 [default=true]; |
||||||
|
optional bool field13 = 13 [default=true]; |
||||||
|
optional bool field14 = 14 [default=true]; |
||||||
|
optional int32 field104 = 104 [default=0]; |
||||||
|
optional int32 field100 = 100 [default=0]; |
||||||
|
optional int32 field101 = 101 [default=0]; |
||||||
|
optional string field102 = 102; |
||||||
|
optional string field103 = 103; |
||||||
|
optional int32 field29 = 29 [default=0]; |
||||||
|
optional bool field30 = 30 [default=false]; |
||||||
|
optional int32 field60 = 60 [default=-1]; |
||||||
|
optional int32 field271 = 271 [default=-1]; |
||||||
|
optional int32 field272 = 272 [default=-1]; |
||||||
|
optional int32 field150 = 150; |
||||||
|
optional int32 field23 = 23 [default=0]; |
||||||
|
optional bool field24 = 24 [default=false]; |
||||||
|
optional int32 field25 = 25 [default=0]; |
||||||
|
optional SpeedMessage1SubMessage field15 = 15; |
||||||
|
optional bool field78 = 78; |
||||||
|
optional int32 field67 = 67 [default=0]; |
||||||
|
optional int32 field68 = 68; |
||||||
|
optional int32 field128 = 128 [default=0]; |
||||||
|
optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; |
||||||
|
optional int32 field131 = 131 [default=0]; |
||||||
|
} |
||||||
|
|
||||||
|
message SpeedMessage1SubMessage { |
||||||
|
optional int32 field1 = 1 [default=0]; |
||||||
|
optional int32 field2 = 2 [default=0]; |
||||||
|
optional int32 field3 = 3 [default=0]; |
||||||
|
optional string field15 = 15; |
||||||
|
optional bool field12 = 12 [default=true]; |
||||||
|
optional int64 field13 = 13; |
||||||
|
optional int64 field14 = 14; |
||||||
|
optional int32 field16 = 16; |
||||||
|
optional int32 field19 = 19 [default=2]; |
||||||
|
optional bool field20 = 20 [default=true]; |
||||||
|
optional bool field28 = 28 [default=true]; |
||||||
|
optional fixed64 field21 = 21; |
||||||
|
optional int32 field22 = 22; |
||||||
|
optional bool field23 = 23 [ default=false ]; |
||||||
|
optional bool field206 = 206 [default=false]; |
||||||
|
optional fixed32 field203 = 203; |
||||||
|
optional int32 field204 = 204; |
||||||
|
optional string field205 = 205; |
||||||
|
optional uint64 field207 = 207; |
||||||
|
optional uint64 field300 = 300; |
||||||
|
} |
||||||
|
|
||||||
|
message SpeedMessage2 { |
||||||
|
optional string field1 = 1; |
||||||
|
optional int64 field3 = 3; |
||||||
|
optional int64 field4 = 4; |
||||||
|
optional int64 field30 = 30; |
||||||
|
optional bool field75 = 75 [default=false]; |
||||||
|
optional string field6 = 6; |
||||||
|
optional bytes field2 = 2; |
||||||
|
optional int32 field21 = 21 [default=0]; |
||||||
|
optional int32 field71 = 71; |
||||||
|
optional float field25 = 25; |
||||||
|
optional int32 field109 = 109 [default=0]; |
||||||
|
optional int32 field210 = 210 [default=0]; |
||||||
|
optional int32 field211 = 211 [default=0]; |
||||||
|
optional int32 field212 = 212 [default=0]; |
||||||
|
optional int32 field213 = 213 [default=0]; |
||||||
|
optional int32 field216 = 216 [default=0]; |
||||||
|
optional int32 field217 = 217 [default=0]; |
||||||
|
optional int32 field218 = 218 [default=0]; |
||||||
|
optional int32 field220 = 220 [default=0]; |
||||||
|
optional int32 field221 = 221 [default=0]; |
||||||
|
optional float field222 = 222 [default=0.0]; |
||||||
|
optional int32 field63 = 63; |
||||||
|
|
||||||
|
repeated group Group1 = 10 { |
||||||
|
required float field11 = 11; |
||||||
|
optional float field26 = 26; |
||||||
|
optional string field12 = 12; |
||||||
|
optional string field13 = 13; |
||||||
|
repeated string field14 = 14; |
||||||
|
required uint64 field15 = 15; |
||||||
|
optional int32 field5 = 5; |
||||||
|
optional string field27 = 27; |
||||||
|
optional int32 field28 = 28; |
||||||
|
optional string field29 = 29; |
||||||
|
optional string field16 = 16; |
||||||
|
repeated string field22 = 22; |
||||||
|
repeated int32 field73 = 73; |
||||||
|
optional int32 field20 = 20 [default=0]; |
||||||
|
optional string field24 = 24; |
||||||
|
optional SpeedMessage2GroupedMessage field31 = 31; |
||||||
|
} |
||||||
|
repeated string field128 = 128; |
||||||
|
optional int64 field131 = 131; |
||||||
|
repeated string field127 = 127; |
||||||
|
optional int32 field129 = 129; |
||||||
|
repeated int64 field130 = 130; |
||||||
|
optional bool field205 = 205 [default=false]; |
||||||
|
optional bool field206 = 206 [default=false]; |
||||||
|
} |
||||||
|
|
||||||
|
message SpeedMessage2GroupedMessage { |
||||||
|
optional float field1 = 1; |
||||||
|
optional float field2 = 2; |
||||||
|
optional float field3 = 3 [default=0.0]; |
||||||
|
optional bool field4 = 4; |
||||||
|
optional bool field5 = 5; |
||||||
|
optional bool field6 = 6 [default=true]; |
||||||
|
optional bool field7 = 7 [default=false]; |
||||||
|
optional float field8 = 8; |
||||||
|
optional bool field9 = 9; |
||||||
|
optional float field10 = 10; |
||||||
|
optional int64 field11 = 11; |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasProtoFile"; |
||||||
|
option (google.protobuf.csharp_file_options).add_serializable = true; |
||||||
|
|
||||||
|
package protobuf_unittest_extra; |
||||||
|
|
||||||
|
option java_package = "com.google.protobuf"; |
||||||
|
|
||||||
|
message TestUnpackedExtensions { |
||||||
|
extensions 1 to max; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestUnpackedExtensions { |
||||||
|
repeated int32 unpacked_int32_extension = 90; |
||||||
|
repeated int64 unpacked_int64_extension = 91; |
||||||
|
repeated uint32 unpacked_uint32_extension = 92; |
||||||
|
repeated uint64 unpacked_uint64_extension = 93; |
||||||
|
repeated sint32 unpacked_sint32_extension = 94; |
||||||
|
repeated sint64 unpacked_sint64_extension = 95; |
||||||
|
repeated fixed32 unpacked_fixed32_extension = 96; |
||||||
|
repeated fixed64 unpacked_fixed64_extension = 97; |
||||||
|
repeated sfixed32 unpacked_sfixed32_extension = 98; |
||||||
|
repeated sfixed64 unpacked_sfixed64_extension = 99; |
||||||
|
repeated float unpacked_float_extension = 100; |
||||||
|
repeated double unpacked_double_extension = 101; |
||||||
|
repeated bool unpacked_bool_extension = 102; |
||||||
|
repeated UnpackedExtensionsForeignEnum unpacked_enum_extension = 103; |
||||||
|
} |
||||||
|
|
||||||
|
enum UnpackedExtensionsForeignEnum { |
||||||
|
FOREIGN_FOO = 4; |
||||||
|
FOREIGN_BAR = 5; |
||||||
|
FOREIGN_BAZ = 6; |
||||||
|
} |
@ -0,0 +1,72 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasFullProtoFile"; |
||||||
|
|
||||||
|
package protobuf_unittest_extra; |
||||||
|
|
||||||
|
option optimize_for = CODE_SIZE; |
||||||
|
|
||||||
|
option java_package = "com.google.protobuf"; |
||||||
|
|
||||||
|
message TestInteropPerson { |
||||||
|
required string name = 1; |
||||||
|
required int32 id = 2; |
||||||
|
optional string email = 3; |
||||||
|
repeated int32 codes = 10 [packed=true]; |
||||||
|
|
||||||
|
enum PhoneType { |
||||||
|
MOBILE = 0; |
||||||
|
HOME = 1; |
||||||
|
WORK = 2; |
||||||
|
} |
||||||
|
|
||||||
|
message PhoneNumber { |
||||||
|
required string number = 1; |
||||||
|
optional PhoneType type = 2 [default = HOME]; |
||||||
|
} |
||||||
|
|
||||||
|
repeated PhoneNumber phone = 4; |
||||||
|
|
||||||
|
repeated group Addresses = 5 { |
||||||
|
required string address = 1; |
||||||
|
optional string address2 = 2; |
||||||
|
required string city = 3; |
||||||
|
required string state = 4; |
||||||
|
required fixed32 zip = 5; |
||||||
|
} |
||||||
|
|
||||||
|
extensions 100 to 199; |
||||||
|
} |
||||||
|
|
||||||
|
message TestInteropEmployeeId { |
||||||
|
required string number = 1; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestInteropPerson { |
||||||
|
required TestInteropEmployeeId employee_id = 126; |
||||||
|
} |
||||||
|
|
||||||
|
message TestMissingFieldsA { |
||||||
|
required string name = 1; |
||||||
|
required int32 id = 2; |
||||||
|
optional string email = 3; |
||||||
|
|
||||||
|
message SubA { |
||||||
|
required int32 count = 5; |
||||||
|
repeated string values = 6; |
||||||
|
} |
||||||
|
optional SubA testA = 11; |
||||||
|
} |
||||||
|
|
||||||
|
message TestMissingFieldsB { |
||||||
|
required string name = 1; |
||||||
|
required int32 id = 2; |
||||||
|
optional string website = 4; |
||||||
|
|
||||||
|
message SubB { |
||||||
|
repeated string values = 7; |
||||||
|
} |
||||||
|
optional SubB testB = 12; |
||||||
|
} |
@ -0,0 +1,117 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasLiteProtoFile"; |
||||||
|
option (google.protobuf.csharp_file_options).add_serializable = true; |
||||||
|
|
||||||
|
package protobuf_unittest_extra; |
||||||
|
|
||||||
|
option optimize_for = LITE_RUNTIME; |
||||||
|
|
||||||
|
option java_package = "com.google.protobuf"; |
||||||
|
|
||||||
|
message TestRequiredLite { |
||||||
|
required int32 d = 1; |
||||||
|
required ExtraEnum en = 2 [default = DEFAULT]; |
||||||
|
} |
||||||
|
|
||||||
|
enum ExtraEnum { |
||||||
|
DEFAULT = 10; |
||||||
|
EXLITE_FOO = 7; |
||||||
|
EXLITE_BAR = 8; |
||||||
|
EXLITE_BAZ = 9; |
||||||
|
} |
||||||
|
|
||||||
|
message TestInteropPersonLite { |
||||||
|
required string name = 1; |
||||||
|
required int32 id = 2; |
||||||
|
optional string email = 3; |
||||||
|
repeated int32 codes = 10 [packed=true]; |
||||||
|
|
||||||
|
enum PhoneType { |
||||||
|
MOBILE = 0; |
||||||
|
HOME = 1; |
||||||
|
WORK = 2; |
||||||
|
} |
||||||
|
|
||||||
|
message PhoneNumber { |
||||||
|
required string number = 1; |
||||||
|
optional PhoneType type = 2 [default = HOME]; |
||||||
|
} |
||||||
|
|
||||||
|
repeated PhoneNumber phone = 4; |
||||||
|
|
||||||
|
repeated group Addresses = 5 { |
||||||
|
required string address = 1; |
||||||
|
optional string address2 = 2; |
||||||
|
required string city = 3; |
||||||
|
required string state = 4; |
||||||
|
required fixed32 zip = 5; |
||||||
|
} |
||||||
|
|
||||||
|
extensions 100 to 199; |
||||||
|
} |
||||||
|
|
||||||
|
message TestInteropEmployeeIdLite { |
||||||
|
required string number = 1; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestInteropPersonLite { |
||||||
|
required TestInteropEmployeeIdLite employee_id_lite = 126; |
||||||
|
} |
||||||
|
|
||||||
|
/* Removed from unittest_lite.proto and added back here */ |
||||||
|
|
||||||
|
message TestUnpackedExtensionsLite { |
||||||
|
extensions 1 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message TestUnpackedTypesLite { |
||||||
|
repeated int32 unpacked_int32 = 90; |
||||||
|
repeated int64 unpacked_int64 = 91; |
||||||
|
repeated uint32 unpacked_uint32 = 92; |
||||||
|
repeated uint64 unpacked_uint64 = 93; |
||||||
|
repeated sint32 unpacked_sint32 = 94; |
||||||
|
repeated sint64 unpacked_sint64 = 95; |
||||||
|
repeated fixed32 unpacked_fixed32 = 96; |
||||||
|
repeated fixed64 unpacked_fixed64 = 97; |
||||||
|
repeated sfixed32 unpacked_sfixed32 = 98; |
||||||
|
repeated sfixed64 unpacked_sfixed64 = 99; |
||||||
|
repeated float unpacked_float = 100; |
||||||
|
repeated double unpacked_double = 101; |
||||||
|
repeated bool unpacked_bool = 102; |
||||||
|
repeated UnpackedTypesForeignEnumLite unpacked_enum = 103; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestUnpackedExtensionsLite { |
||||||
|
repeated int32 unpacked_int32_extension_lite = 90; |
||||||
|
repeated int64 unpacked_int64_extension_lite = 91; |
||||||
|
repeated uint32 unpacked_uint32_extension_lite = 92; |
||||||
|
repeated uint64 unpacked_uint64_extension_lite = 93; |
||||||
|
repeated sint32 unpacked_sint32_extension_lite = 94; |
||||||
|
repeated sint64 unpacked_sint64_extension_lite = 95; |
||||||
|
repeated fixed32 unpacked_fixed32_extension_lite = 96; |
||||||
|
repeated fixed64 unpacked_fixed64_extension_lite = 97; |
||||||
|
repeated sfixed32 unpacked_sfixed32_extension_lite = 98; |
||||||
|
repeated sfixed64 unpacked_sfixed64_extension_lite = 99; |
||||||
|
repeated float unpacked_float_extension_lite = 100; |
||||||
|
repeated double unpacked_double_extension_lite = 101; |
||||||
|
repeated bool unpacked_bool_extension_lite = 102; |
||||||
|
repeated UnpackedTypesForeignEnumLite unpacked_enum_extension_lite = 103; |
||||||
|
} |
||||||
|
|
||||||
|
enum UnpackedTypesForeignEnumLite { |
||||||
|
FOREIGN_LITE_FOO = 4; |
||||||
|
FOREIGN_LITE_BAR = 5; |
||||||
|
FOREIGN_LITE_BAZ = 6; |
||||||
|
} |
||||||
|
|
||||||
|
message BucketOfBytes { |
||||||
|
optional bytes value = 1; |
||||||
|
|
||||||
|
} |
||||||
|
message BucketOfBytesEx { |
||||||
|
optional bytes value = 1; |
||||||
|
optional bytes value2 = 255; |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestXmlSerializerTestProtoFile"; |
||||||
|
option (google.protobuf.csharp_file_options).add_serializable = true; |
||||||
|
|
||||||
|
package protobuf_unittest_extra; |
||||||
|
|
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
enum EnumOptions { |
||||||
|
ONE = 0; |
||||||
|
TWO = 1; |
||||||
|
THREE = 2; |
||||||
|
} |
||||||
|
|
||||||
|
message TestXmlChild { |
||||||
|
repeated EnumOptions options = 3; |
||||||
|
optional bytes binary = 4; |
||||||
|
} |
||||||
|
|
||||||
|
message TestXmlNoFields { |
||||||
|
} |
||||||
|
|
||||||
|
message TestXmlRescursive { |
||||||
|
optional TestXmlRescursive child = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message TestXmlMessage { |
||||||
|
|
||||||
|
optional int64 number = 6; |
||||||
|
repeated int32 numbers = 2; |
||||||
|
optional string text = 3; |
||||||
|
repeated string textlines = 700; |
||||||
|
optional bool valid = 5; |
||||||
|
|
||||||
|
optional TestXmlChild child = 1; |
||||||
|
repeated group Children = 401 { |
||||||
|
repeated EnumOptions options = 3; |
||||||
|
optional bytes binary = 4; |
||||||
|
} |
||||||
|
|
||||||
|
extensions 100 to 199; |
||||||
|
} |
||||||
|
|
||||||
|
message TestXmlExtension { |
||||||
|
required int32 number = 1; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestXmlMessage { |
||||||
|
optional EnumOptions extension_enum = 101; |
||||||
|
optional string extension_text = 102; |
||||||
|
repeated int32 extension_number = 103 [packed = true]; |
||||||
|
optional TestXmlExtension extension_message = 199; |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
import "google/protobuf/unittest.proto"; |
||||||
|
import "google/protobuf/unittest_custom_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGenericServices"; |
||||||
|
|
||||||
|
option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||||
|
|
||||||
|
// We don't put this in a package within proto2 because we need to make sure |
||||||
|
// that the generated code doesn't depend on being in the proto2 namespace. |
||||||
|
package protobuf_unittest; |
||||||
|
|
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
service TestGenericService { |
||||||
|
rpc Foo(FooRequest) returns (FooResponse); |
||||||
|
rpc Bar(BarRequest) returns (BarResponse); |
||||||
|
} |
||||||
|
|
||||||
|
service TestGenericServiceWithCustomOptions { |
||||||
|
option (service_opt1) = -9876543210; |
||||||
|
|
||||||
|
rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) { |
||||||
|
option (method_opt1) = METHODOPT1_VAL2; |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,137 @@ |
|||||||
|
// These proto descriptors have at one time been reported as an issue or defect. |
||||||
|
// They are kept here to replicate the issue, and continue to verify the fix. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
|
||||||
|
// Issue: Non-"Google.Protobuffers" namespace will ensure that protobuffer library types are qualified |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "UnitTest.Issues.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasIssuesProtoFile"; |
||||||
|
|
||||||
|
package unittest_issues; |
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
// The following is a representative set of features |
||||||
|
/* |
||||||
|
enum EnumOptions { |
||||||
|
ONE = 0; |
||||||
|
TWO = 1; |
||||||
|
THREE = 2; |
||||||
|
} |
||||||
|
|
||||||
|
message TestBasicChild |
||||||
|
{ |
||||||
|
repeated EnumOptions options = 3; |
||||||
|
optional bytes binary = 4; |
||||||
|
} |
||||||
|
|
||||||
|
message TestBasicNoFields { |
||||||
|
} |
||||||
|
|
||||||
|
message TestBasicRescursive { |
||||||
|
optional TestBasicRescursive child = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message TestBasicMessage { |
||||||
|
|
||||||
|
optional int64 number = 6; |
||||||
|
repeated int32 numbers = 2; |
||||||
|
optional string text = 3; |
||||||
|
repeated string textlines = 700; |
||||||
|
optional bool valid = 5; |
||||||
|
|
||||||
|
optional TestBasicChild child = 1; |
||||||
|
repeated group Children = 401 |
||||||
|
{ |
||||||
|
repeated EnumOptions options = 3; |
||||||
|
optional bytes binary = 4; |
||||||
|
} |
||||||
|
|
||||||
|
extensions 100 to 199; |
||||||
|
} |
||||||
|
|
||||||
|
message TestBasicExtension { |
||||||
|
required int32 number = 1; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestBasicMessage { |
||||||
|
optional EnumOptions extension_enum = 101; |
||||||
|
optional string extension_text = 102; |
||||||
|
repeated int32 extension_number = 103 [packed = true]; |
||||||
|
optional TestBasicExtension extension_message = 199; |
||||||
|
} |
||||||
|
|
||||||
|
// Issue for non-qualified type reference in new services generation |
||||||
|
option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH; |
||||||
|
|
||||||
|
service TestGenericService { |
||||||
|
rpc Foo(TestBasicNoFields) returns (TestBasicMessage); |
||||||
|
rpc Bar(TestBasicNoFields) returns (TestBasicMessage); |
||||||
|
} |
||||||
|
*/ |
||||||
|
// Issue 13: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=13 |
||||||
|
|
||||||
|
message A { |
||||||
|
optional int32 _A = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message B { |
||||||
|
optional int32 B_ = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message AB { |
||||||
|
optional int32 a_b = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// Similar issue with numeric names |
||||||
|
message NumberField { |
||||||
|
optional int32 _01 = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// Issue 28: Circular message dependencies result in null defaults for DefaultInstance |
||||||
|
|
||||||
|
message MyMessageAReferenceB { |
||||||
|
required MyMessageBReferenceA value = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message MyMessageBReferenceA { |
||||||
|
required MyMessageAReferenceB value = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// issue 19 - negative enum values |
||||||
|
|
||||||
|
enum NegativeEnum { |
||||||
|
FiveBelow = -5; |
||||||
|
MinusOne = -1; |
||||||
|
Zero = 0; |
||||||
|
} |
||||||
|
|
||||||
|
message NegativeEnumMessage { |
||||||
|
optional NegativeEnum value = 1; |
||||||
|
repeated NegativeEnum values = 2; |
||||||
|
repeated NegativeEnum packed_values = 3 [packed=true]; |
||||||
|
} |
||||||
|
|
||||||
|
// Issue 21: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=21 |
||||||
|
// Decorate fields with [deprecated=true] as [System.Obsolete] |
||||||
|
|
||||||
|
message DeprecatedChild { |
||||||
|
} |
||||||
|
|
||||||
|
enum DeprecatedEnum { |
||||||
|
one = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message DeprecatedFieldsMessage { |
||||||
|
optional int32 PrimitiveValue = 1 [deprecated = true]; |
||||||
|
repeated int32 PrimitiveArray = 2 [deprecated = true]; |
||||||
|
|
||||||
|
optional DeprecatedChild MessageValue = 3 [deprecated = true]; |
||||||
|
repeated DeprecatedChild MessageArray = 4 [deprecated = true]; |
||||||
|
|
||||||
|
optional DeprecatedEnum EnumValue = 5 [deprecated = true]; |
||||||
|
repeated DeprecatedEnum EnumArray = 6 [deprecated = true]; |
||||||
|
} |
||||||
|
|
||||||
|
// Issue 45: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=45 |
||||||
|
message ItemField { |
||||||
|
optional int32 item = 1; |
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestRpcInterop"; |
||||||
|
|
||||||
|
option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH; |
||||||
|
|
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
message SearchRequest { |
||||||
|
repeated string Criteria = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message SearchResponse { |
||||||
|
message ResultItem { |
||||||
|
required string url = 1; |
||||||
|
optional string name = 2; |
||||||
|
} |
||||||
|
|
||||||
|
repeated ResultItem results = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message RefineSearchRequest { |
||||||
|
repeated string Criteria = 1; |
||||||
|
required SearchResponse previous_results = 2; |
||||||
|
} |
||||||
|
|
||||||
|
service SearchService { |
||||||
|
/* |
||||||
|
Add this option to specify the GuidAttribute on the service interface |
||||||
|
option (google.protobuf.csharp_service_options).interface_id = "{A65F0925-FD11-4f94-B166-89AC4F027205}"; |
||||||
|
*/ |
||||||
|
rpc Search (SearchRequest) returns (SearchResponse) |
||||||
|
/* |
||||||
|
Add this option to specify the DispIdAttribute on the service interface |
||||||
|
{ option (google.protobuf.csharp_method_options).dispatch_id = 5; } |
||||||
|
*/ ; |
||||||
|
|
||||||
|
rpc RefineSearch (RefineSearchRequest) returns (SearchResponse); |
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestRpcInteropLite"; |
||||||
|
|
||||||
|
option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH; |
||||||
|
|
||||||
|
option optimize_for = LITE_RUNTIME; |
||||||
|
package unittest_rpc_interop_lite; |
||||||
|
|
||||||
|
message SearchRequest { |
||||||
|
repeated string Criteria = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message SearchResponse { |
||||||
|
message ResultItem { |
||||||
|
required string url = 1; |
||||||
|
optional string name = 2; |
||||||
|
} |
||||||
|
|
||||||
|
repeated ResultItem results = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message RefineSearchRequest { |
||||||
|
repeated string Criteria = 1; |
||||||
|
required SearchResponse previous_results = 2; |
||||||
|
} |
||||||
|
|
||||||
|
service SearchService { |
||||||
|
/* |
||||||
|
Add this option to specify the GuidAttribute on the service interface |
||||||
|
option (google.protobuf.csharp_service_options).interface_id = "{A65F0925-FD11-4f94-B166-89AC4F027205}"; |
||||||
|
*/ |
||||||
|
rpc Search (SearchRequest) returns (SearchResponse) |
||||||
|
/* |
||||||
|
Add this option to specify the DispIdAttribute on the service interface |
||||||
|
{ option (google.protobuf.csharp_method_options).dispatch_id = 5; } |
||||||
|
*/ ; |
||||||
|
|
||||||
|
rpc RefineSearch (RefineSearchRequest) returns (SearchResponse); |
||||||
|
} |
@ -0,0 +1,147 @@ |
|||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// |
||||||
|
// WARNING: The plugin interface is currently EXPERIMENTAL and is subject to |
||||||
|
// change. |
||||||
|
// |
||||||
|
// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is |
||||||
|
// just a program that reads a CodeGeneratorRequest from stdin and writes a |
||||||
|
// CodeGeneratorResponse to stdout. |
||||||
|
// |
||||||
|
// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead |
||||||
|
// of dealing with the raw protocol defined here. |
||||||
|
// |
||||||
|
// A plugin executable needs only to be placed somewhere in the path. The |
||||||
|
// plugin should be named "protoc-gen-$NAME", and will then be used when the |
||||||
|
// flag "--${NAME}_out" is passed to protoc. |
||||||
|
|
||||||
|
package google.protobuf.compiler; |
||||||
|
option java_package = "com.google.protobuf.compiler"; |
||||||
|
option java_outer_classname = "PluginProtos"; |
||||||
|
|
||||||
|
import "google/protobuf/descriptor.proto"; |
||||||
|
|
||||||
|
// An encoded CodeGeneratorRequest is written to the plugin's stdin. |
||||||
|
message CodeGeneratorRequest { |
||||||
|
// The .proto files that were explicitly listed on the command-line. The |
||||||
|
// code generator should generate code only for these files. Each file's |
||||||
|
// descriptor will be included in proto_file, below. |
||||||
|
repeated string file_to_generate = 1; |
||||||
|
|
||||||
|
// The generator parameter passed on the command-line. |
||||||
|
optional string parameter = 2; |
||||||
|
|
||||||
|
// FileDescriptorProtos for all files in files_to_generate and everything |
||||||
|
// they import. The files will appear in topological order, so each file |
||||||
|
// appears before any file that imports it. |
||||||
|
// |
||||||
|
// protoc guarantees that all proto_files will be written after |
||||||
|
// the fields above, even though this is not technically guaranteed by the |
||||||
|
// protobuf wire format. This theoretically could allow a plugin to stream |
||||||
|
// in the FileDescriptorProtos and handle them one by one rather than read |
||||||
|
// the entire set into memory at once. However, as of this writing, this |
||||||
|
// is not similarly optimized on protoc's end -- it will store all fields in |
||||||
|
// memory at once before sending them to the plugin. |
||||||
|
repeated FileDescriptorProto proto_file = 15; |
||||||
|
} |
||||||
|
|
||||||
|
// The plugin writes an encoded CodeGeneratorResponse to stdout. |
||||||
|
message CodeGeneratorResponse { |
||||||
|
// Error message. If non-empty, code generation failed. The plugin process |
||||||
|
// should exit with status code zero even if it reports an error in this way. |
||||||
|
// |
||||||
|
// This should be used to indicate errors in .proto files which prevent the |
||||||
|
// code generator from generating correct code. Errors which indicate a |
||||||
|
// problem in protoc itself -- such as the input CodeGeneratorRequest being |
||||||
|
// unparseable -- should be reported by writing a message to stderr and |
||||||
|
// exiting with a non-zero status code. |
||||||
|
optional string error = 1; |
||||||
|
|
||||||
|
// Represents a single generated file. |
||||||
|
message File { |
||||||
|
// The file name, relative to the output directory. The name must not |
||||||
|
// contain "." or ".." components and must be relative, not be absolute (so, |
||||||
|
// the file cannot lie outside the output directory). "/" must be used as |
||||||
|
// the path separator, not "\". |
||||||
|
// |
||||||
|
// If the name is omitted, the content will be appended to the previous |
||||||
|
// file. This allows the generator to break large files into small chunks, |
||||||
|
// and allows the generated text to be streamed back to protoc so that large |
||||||
|
// files need not reside completely in memory at one time. Note that as of |
||||||
|
// this writing protoc does not optimize for this -- it will read the entire |
||||||
|
// CodeGeneratorResponse before writing files to disk. |
||||||
|
optional string name = 1; |
||||||
|
|
||||||
|
// If non-empty, indicates that the named file should already exist, and the |
||||||
|
// content here is to be inserted into that file at a defined insertion |
||||||
|
// point. This feature allows a code generator to extend the output |
||||||
|
// produced by another code generator. The original generator may provide |
||||||
|
// insertion points by placing special annotations in the file that look |
||||||
|
// like: |
||||||
|
// @@protoc_insertion_point(NAME) |
||||||
|
// The annotation can have arbitrary text before and after it on the line, |
||||||
|
// which allows it to be placed in a comment. NAME should be replaced with |
||||||
|
// an identifier naming the point -- this is what other generators will use |
||||||
|
// as the insertion_point. Code inserted at this point will be placed |
||||||
|
// immediately above the line containing the insertion point (thus multiple |
||||||
|
// insertions to the same point will come out in the order they were added). |
||||||
|
// The double-@ is intended to make it unlikely that the generated code |
||||||
|
// could contain things that look like insertion points by accident. |
||||||
|
// |
||||||
|
// For example, the C++ code generator places the following line in the |
||||||
|
// .pb.h files that it generates: |
||||||
|
// // @@protoc_insertion_point(namespace_scope) |
||||||
|
// This line appears within the scope of the file's package namespace, but |
||||||
|
// outside of any particular class. Another plugin can then specify the |
||||||
|
// insertion_point "namespace_scope" to generate additional classes or |
||||||
|
// other declarations that should be placed in this scope. |
||||||
|
// |
||||||
|
// Note that if the line containing the insertion point begins with |
||||||
|
// whitespace, the same whitespace will be added to every line of the |
||||||
|
// inserted text. This is useful for languages like Python, where |
||||||
|
// indentation matters. In these languages, the insertion point comment |
||||||
|
// should be indented the same amount as any inserted code will need to be |
||||||
|
// in order to work correctly in that context. |
||||||
|
// |
||||||
|
// The code generator that generates the initial file and the one which |
||||||
|
// inserts into it must both run as part of a single invocation of protoc. |
||||||
|
// Code generators are executed in the order in which they appear on the |
||||||
|
// command line. |
||||||
|
// |
||||||
|
// If |insertion_point| is present, |name| must also be present. |
||||||
|
optional string insertion_point = 2; |
||||||
|
|
||||||
|
// The file contents. |
||||||
|
optional string content = 15; |
||||||
|
} |
||||||
|
repeated File file = 15; |
||||||
|
} |
@ -0,0 +1,115 @@ |
|||||||
|
// Extra options for C# generator |
||||||
|
|
||||||
|
import "google/protobuf/descriptor.proto"; |
||||||
|
|
||||||
|
package google.protobuf; |
||||||
|
|
||||||
|
message CSharpFileOptions { |
||||||
|
|
||||||
|
// Namespace for generated classes; defaults to the package. |
||||||
|
optional string namespace = 1; |
||||||
|
|
||||||
|
// Name of the "umbrella" class used for metadata about all |
||||||
|
// the messages within this file. Default is based on the name |
||||||
|
// of the file. |
||||||
|
optional string umbrella_classname = 2; |
||||||
|
|
||||||
|
// Whether classes should be public (true) or internal (false) |
||||||
|
optional bool public_classes = 3 [default = true]; |
||||||
|
|
||||||
|
// Whether to generate a single file for everything within the |
||||||
|
// .proto file (false), or one file per message (true). |
||||||
|
// This option is not currently honored; please log a feature |
||||||
|
// request if you really want it. |
||||||
|
optional bool multiple_files = 4; |
||||||
|
|
||||||
|
// Whether to nest messages within a single umbrella class (true) |
||||||
|
// or create the umbrella class as a peer, with messages as |
||||||
|
// top-level classes in the namespace (false) |
||||||
|
optional bool nest_classes = 5; |
||||||
|
|
||||||
|
// Generate appropriate support for Code Contracts |
||||||
|
// (Ongoing; support should improve over time) |
||||||
|
optional bool code_contracts = 6; |
||||||
|
|
||||||
|
// Create subdirectories for namespaces, e.g. namespace "Foo.Bar" |
||||||
|
// would generate files within [output directory]/Foo/Bar |
||||||
|
optional bool expand_namespace_directories = 7; |
||||||
|
|
||||||
|
// Generate attributes indicating non-CLS-compliance |
||||||
|
optional bool cls_compliance = 8 [default = true]; |
||||||
|
|
||||||
|
// Generate messages/builders with the [Serializable] attribute |
||||||
|
optional bool add_serializable = 9 [default = false]; |
||||||
|
|
||||||
|
// Generates a private ctor for Message types |
||||||
|
optional bool generate_private_ctor = 10 [default = true]; |
||||||
|
|
||||||
|
// The extension that should be appended to the umbrella_classname when creating files. |
||||||
|
optional string file_extension = 221 [default = ".cs"]; |
||||||
|
|
||||||
|
// A nested namespace for the umbrella class. Helpful for name collisions caused by |
||||||
|
// umbrella_classname conflicting with an existing type. This will be automatically |
||||||
|
// set to 'Proto' if a collision is detected with types being generated. This value |
||||||
|
// is ignored when nest_classes == true |
||||||
|
optional string umbrella_namespace = 222; |
||||||
|
|
||||||
|
// The output path for the source file(s) generated |
||||||
|
optional string output_directory = 223 [default = "."]; |
||||||
|
|
||||||
|
// Will ignore the type generations and remove dependencies for the descriptor proto |
||||||
|
// files that declare their package to be "google.protobuf" |
||||||
|
optional bool ignore_google_protobuf = 224 [default = false]; |
||||||
|
|
||||||
|
// Controls how services are generated, GENERIC is the deprecated original implementation |
||||||
|
// INTERFACE generates service interfaces only, RPCINTEROP generates interfaces and |
||||||
|
// implementations using the included Windows RPC interop libarary. |
||||||
|
optional CSharpServiceType service_generator_type = 225 [default = NONE]; |
||||||
|
|
||||||
|
// Used to add the System.Runtime.CompilerServices.CompilerGeneratedAttribute and |
||||||
|
// System.CodeDom.Compiler.GeneratedCodeAttribute attributes to generated code. |
||||||
|
optional bool generated_code_attributes = 226 [default = false]; |
||||||
|
} |
||||||
|
|
||||||
|
enum CSharpServiceType { |
||||||
|
// Services are ignored by the generator |
||||||
|
NONE = 0; |
||||||
|
// Generates the original Java generic service implementations |
||||||
|
GENERIC = 1; |
||||||
|
// Generates an interface for the service and nothing else |
||||||
|
INTERFACE = 2; |
||||||
|
// Generates an interface for the service and client/server wrappers for the interface |
||||||
|
IRPCDISPATCH = 3; |
||||||
|
} |
||||||
|
|
||||||
|
extend FileOptions { |
||||||
|
optional CSharpFileOptions csharp_file_options = 1000; |
||||||
|
} |
||||||
|
|
||||||
|
extend FieldOptions { |
||||||
|
optional CSharpFieldOptions csharp_field_options = 1000; |
||||||
|
} |
||||||
|
|
||||||
|
message CSharpFieldOptions { |
||||||
|
// Provides the ability to override the name of the property |
||||||
|
// generated for this field. This is applied to all properties |
||||||
|
// and methods to do with this field, including HasFoo, FooCount, |
||||||
|
// FooList etc. |
||||||
|
optional string property_name = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message CSharpServiceOptions { |
||||||
|
optional string interface_id = 1; |
||||||
|
} |
||||||
|
|
||||||
|
extend ServiceOptions { |
||||||
|
optional CSharpServiceOptions csharp_service_options = 1000; |
||||||
|
} |
||||||
|
|
||||||
|
message CSharpMethodOptions { |
||||||
|
optional int32 dispatch_id = 1; |
||||||
|
} |
||||||
|
|
||||||
|
extend MethodOptions { |
||||||
|
optional CSharpMethodOptions csharp_method_options = 1000; |
||||||
|
} |
@ -0,0 +1,533 @@ |
|||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// Based on original Protocol Buffers design by |
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others. |
||||||
|
// |
||||||
|
// The messages in this file describe the definitions found in .proto files. |
||||||
|
// A valid .proto file can be translated directly to a FileDescriptorProto |
||||||
|
// without any other information (e.g. without reading its imports). |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
package google.protobuf; |
||||||
|
option java_package = "com.google.protobuf"; |
||||||
|
option java_outer_classname = "DescriptorProtos"; |
||||||
|
|
||||||
|
// descriptor.proto must be optimized for speed because reflection-based |
||||||
|
// algorithms don't work during bootstrapping. |
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
// The protocol compiler can output a FileDescriptorSet containing the .proto |
||||||
|
// files it parses. |
||||||
|
message FileDescriptorSet { |
||||||
|
repeated FileDescriptorProto file = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a complete .proto file. |
||||||
|
message FileDescriptorProto { |
||||||
|
optional string name = 1; // file name, relative to root of source tree |
||||||
|
optional string package = 2; // e.g. "foo", "foo.bar", etc. |
||||||
|
|
||||||
|
// Names of files imported by this file. |
||||||
|
repeated string dependency = 3; |
||||||
|
|
||||||
|
// All top-level definitions in this file. |
||||||
|
repeated DescriptorProto message_type = 4; |
||||||
|
repeated EnumDescriptorProto enum_type = 5; |
||||||
|
repeated ServiceDescriptorProto service = 6; |
||||||
|
repeated FieldDescriptorProto extension = 7; |
||||||
|
|
||||||
|
optional FileOptions options = 8; |
||||||
|
|
||||||
|
// This field contains optional information about the original source code. |
||||||
|
// You may safely remove this entire field whithout harming runtime |
||||||
|
// functionality of the descriptors -- the information is needed only by |
||||||
|
// development tools. |
||||||
|
optional SourceCodeInfo source_code_info = 9; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a message type. |
||||||
|
message DescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
|
||||||
|
repeated FieldDescriptorProto field = 2; |
||||||
|
repeated FieldDescriptorProto extension = 6; |
||||||
|
|
||||||
|
repeated DescriptorProto nested_type = 3; |
||||||
|
repeated EnumDescriptorProto enum_type = 4; |
||||||
|
|
||||||
|
message ExtensionRange { |
||||||
|
optional int32 start = 1; |
||||||
|
optional int32 end = 2; |
||||||
|
} |
||||||
|
repeated ExtensionRange extension_range = 5; |
||||||
|
|
||||||
|
optional MessageOptions options = 7; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a field within a message. |
||||||
|
message FieldDescriptorProto { |
||||||
|
enum Type { |
||||||
|
// 0 is reserved for errors. |
||||||
|
// Order is weird for historical reasons. |
||||||
|
TYPE_DOUBLE = 1; |
||||||
|
TYPE_FLOAT = 2; |
||||||
|
TYPE_INT64 = 3; // Not ZigZag encoded. Negative numbers |
||||||
|
// take 10 bytes. Use TYPE_SINT64 if negative |
||||||
|
// values are likely. |
||||||
|
TYPE_UINT64 = 4; |
||||||
|
TYPE_INT32 = 5; // Not ZigZag encoded. Negative numbers |
||||||
|
// take 10 bytes. Use TYPE_SINT32 if negative |
||||||
|
// values are likely. |
||||||
|
TYPE_FIXED64 = 6; |
||||||
|
TYPE_FIXED32 = 7; |
||||||
|
TYPE_BOOL = 8; |
||||||
|
TYPE_STRING = 9; |
||||||
|
TYPE_GROUP = 10; // Tag-delimited aggregate. |
||||||
|
TYPE_MESSAGE = 11; // Length-delimited aggregate. |
||||||
|
|
||||||
|
// New in version 2. |
||||||
|
TYPE_BYTES = 12; |
||||||
|
TYPE_UINT32 = 13; |
||||||
|
TYPE_ENUM = 14; |
||||||
|
TYPE_SFIXED32 = 15; |
||||||
|
TYPE_SFIXED64 = 16; |
||||||
|
TYPE_SINT32 = 17; // Uses ZigZag encoding. |
||||||
|
TYPE_SINT64 = 18; // Uses ZigZag encoding. |
||||||
|
}; |
||||||
|
|
||||||
|
enum Label { |
||||||
|
// 0 is reserved for errors |
||||||
|
LABEL_OPTIONAL = 1; |
||||||
|
LABEL_REQUIRED = 2; |
||||||
|
LABEL_REPEATED = 3; |
||||||
|
// TODO(sanjay): Should we add LABEL_MAP? |
||||||
|
}; |
||||||
|
|
||||||
|
optional string name = 1; |
||||||
|
optional int32 number = 3; |
||||||
|
optional Label label = 4; |
||||||
|
|
||||||
|
// If type_name is set, this need not be set. If both this and type_name |
||||||
|
// are set, this must be either TYPE_ENUM or TYPE_MESSAGE. |
||||||
|
optional Type type = 5; |
||||||
|
|
||||||
|
// For message and enum types, this is the name of the type. If the name |
||||||
|
// starts with a '.', it is fully-qualified. Otherwise, C++-like scoping |
||||||
|
// rules are used to find the type (i.e. first the nested types within this |
||||||
|
// message are searched, then within the parent, on up to the root |
||||||
|
// namespace). |
||||||
|
optional string type_name = 6; |
||||||
|
|
||||||
|
// For extensions, this is the name of the type being extended. It is |
||||||
|
// resolved in the same manner as type_name. |
||||||
|
optional string extendee = 2; |
||||||
|
|
||||||
|
// For numeric types, contains the original text representation of the value. |
||||||
|
// For booleans, "true" or "false". |
||||||
|
// For strings, contains the default text contents (not escaped in any way). |
||||||
|
// For bytes, contains the C escaped value. All bytes >= 128 are escaped. |
||||||
|
// TODO(kenton): Base-64 encode? |
||||||
|
optional string default_value = 7; |
||||||
|
|
||||||
|
optional FieldOptions options = 8; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes an enum type. |
||||||
|
message EnumDescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
|
||||||
|
repeated EnumValueDescriptorProto value = 2; |
||||||
|
|
||||||
|
optional EnumOptions options = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a value within an enum. |
||||||
|
message EnumValueDescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
optional int32 number = 2; |
||||||
|
|
||||||
|
optional EnumValueOptions options = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a service. |
||||||
|
message ServiceDescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
repeated MethodDescriptorProto method = 2; |
||||||
|
|
||||||
|
optional ServiceOptions options = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a method of a service. |
||||||
|
message MethodDescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
|
||||||
|
// Input and output type names. These are resolved in the same way as |
||||||
|
// FieldDescriptorProto.type_name, but must refer to a message type. |
||||||
|
optional string input_type = 2; |
||||||
|
optional string output_type = 3; |
||||||
|
|
||||||
|
optional MethodOptions options = 4; |
||||||
|
} |
||||||
|
|
||||||
|
// =================================================================== |
||||||
|
// Options |
||||||
|
|
||||||
|
// Each of the definitions above may have "options" attached. These are |
||||||
|
// just annotations which may cause code to be generated slightly differently |
||||||
|
// or may contain hints for code that manipulates protocol messages. |
||||||
|
// |
||||||
|
// Clients may define custom options as extensions of the *Options messages. |
||||||
|
// These extensions may not yet be known at parsing time, so the parser cannot |
||||||
|
// store the values in them. Instead it stores them in a field in the *Options |
||||||
|
// message called uninterpreted_option. This field must have the same name |
||||||
|
// across all *Options messages. We then use this field to populate the |
||||||
|
// extensions when we build a descriptor, at which point all protos have been |
||||||
|
// parsed and so all extensions are known. |
||||||
|
// |
||||||
|
// Extension numbers for custom options may be chosen as follows: |
||||||
|
// * For options which will only be used within a single application or |
||||||
|
// organization, or for experimental options, use field numbers 50000 |
||||||
|
// through 99999. It is up to you to ensure that you do not use the |
||||||
|
// same number for multiple options. |
||||||
|
// * For options which will be published and used publicly by multiple |
||||||
|
// independent entities, e-mail kenton@google.com to reserve extension |
||||||
|
// numbers. Simply tell me how many you need and I'll send you back a |
||||||
|
// set of numbers to use -- there's no need to explain how you intend to |
||||||
|
// use them. If this turns out to be popular, a web service will be set up |
||||||
|
// to automatically assign option numbers. |
||||||
|
|
||||||
|
|
||||||
|
message FileOptions { |
||||||
|
|
||||||
|
// Sets the Java package where classes generated from this .proto will be |
||||||
|
// placed. By default, the proto package is used, but this is often |
||||||
|
// inappropriate because proto packages do not normally start with backwards |
||||||
|
// domain names. |
||||||
|
optional string java_package = 1; |
||||||
|
|
||||||
|
|
||||||
|
// If set, all the classes from the .proto file are wrapped in a single |
||||||
|
// outer class with the given name. This applies to both Proto1 |
||||||
|
// (equivalent to the old "--one_java_file" option) and Proto2 (where |
||||||
|
// a .proto always translates to a single class, but you may want to |
||||||
|
// explicitly choose the class name). |
||||||
|
optional string java_outer_classname = 8; |
||||||
|
|
||||||
|
// If set true, then the Java code generator will generate a separate .java |
||||||
|
// file for each top-level message, enum, and service defined in the .proto |
||||||
|
// file. Thus, these types will *not* be nested inside the outer class |
||||||
|
// named by java_outer_classname. However, the outer class will still be |
||||||
|
// generated to contain the file's getDescriptor() method as well as any |
||||||
|
// top-level extensions defined in the file. |
||||||
|
optional bool java_multiple_files = 10 [default=false]; |
||||||
|
|
||||||
|
// If set true, then the Java code generator will generate equals() and |
||||||
|
// hashCode() methods for all messages defined in the .proto file. This is |
||||||
|
// purely a speed optimization, as the AbstractMessage base class includes |
||||||
|
// reflection-based implementations of these methods. |
||||||
|
optional bool java_generate_equals_and_hash = 20 [default=false]; |
||||||
|
|
||||||
|
// Generated classes can be optimized for speed or code size. |
||||||
|
enum OptimizeMode { |
||||||
|
SPEED = 1; // Generate complete code for parsing, serialization, |
||||||
|
// etc. |
||||||
|
CODE_SIZE = 2; // Use ReflectionOps to implement these methods. |
||||||
|
LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. |
||||||
|
} |
||||||
|
optional OptimizeMode optimize_for = 9 [default=SPEED]; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Should generic services be generated in each language? "Generic" services |
||||||
|
// are not specific to any particular RPC system. They are generated by the |
||||||
|
// main code generators in each language (without additional plugins). |
||||||
|
// Generic services were the only kind of service generation supported by |
||||||
|
// early versions of proto2. |
||||||
|
// |
||||||
|
// Generic services are now considered deprecated in favor of using plugins |
||||||
|
// that generate code specific to your particular RPC system. Therefore, |
||||||
|
// these default to false. Old code which depends on generic services should |
||||||
|
// explicitly set them to true. |
||||||
|
optional bool cc_generic_services = 16 [default=false]; |
||||||
|
optional bool java_generic_services = 17 [default=false]; |
||||||
|
optional bool py_generic_services = 18 [default=false]; |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message MessageOptions { |
||||||
|
// Set true to use the old proto1 MessageSet wire format for extensions. |
||||||
|
// This is provided for backwards-compatibility with the MessageSet wire |
||||||
|
// format. You should not use this for any other reason: It's less |
||||||
|
// efficient, has fewer features, and is more complicated. |
||||||
|
// |
||||||
|
// The message must be defined exactly as follows: |
||||||
|
// message Foo { |
||||||
|
// option message_set_wire_format = true; |
||||||
|
// extensions 4 to max; |
||||||
|
// } |
||||||
|
// Note that the message cannot have any defined fields; MessageSets only |
||||||
|
// have extensions. |
||||||
|
// |
||||||
|
// All extensions of your type must be singular messages; e.g. they cannot |
||||||
|
// be int32s, enums, or repeated messages. |
||||||
|
// |
||||||
|
// Because this is an option, the above two restrictions are not enforced by |
||||||
|
// the protocol compiler. |
||||||
|
optional bool message_set_wire_format = 1 [default=false]; |
||||||
|
|
||||||
|
// Disables the generation of the standard "descriptor()" accessor, which can |
||||||
|
// conflict with a field of the same name. This is meant to make migration |
||||||
|
// from proto1 easier; new code should avoid fields named "descriptor". |
||||||
|
optional bool no_standard_descriptor_accessor = 2 [default=false]; |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message FieldOptions { |
||||||
|
// The ctype option instructs the C++ code generator to use a different |
||||||
|
// representation of the field than it normally would. See the specific |
||||||
|
// options below. This option is not yet implemented in the open source |
||||||
|
// release -- sorry, we'll try to include it in a future version! |
||||||
|
optional CType ctype = 1 [default = STRING]; |
||||||
|
enum CType { |
||||||
|
// Default mode. |
||||||
|
STRING = 0; |
||||||
|
|
||||||
|
CORD = 1; |
||||||
|
|
||||||
|
STRING_PIECE = 2; |
||||||
|
} |
||||||
|
// The packed option can be enabled for repeated primitive fields to enable |
||||||
|
// a more efficient representation on the wire. Rather than repeatedly |
||||||
|
// writing the tag and type for each element, the entire array is encoded as |
||||||
|
// a single length-delimited blob. |
||||||
|
optional bool packed = 2; |
||||||
|
|
||||||
|
|
||||||
|
// Is this field deprecated? |
||||||
|
// Depending on the target platform, this can emit Deprecated annotations |
||||||
|
// for accessors, or it will be completely ignored; in the very least, this |
||||||
|
// is a formalization for deprecating fields. |
||||||
|
optional bool deprecated = 3 [default=false]; |
||||||
|
|
||||||
|
// EXPERIMENTAL. DO NOT USE. |
||||||
|
// For "map" fields, the name of the field in the enclosed type that |
||||||
|
// is the key for this map. For example, suppose we have: |
||||||
|
// message Item { |
||||||
|
// required string name = 1; |
||||||
|
// required string value = 2; |
||||||
|
// } |
||||||
|
// message Config { |
||||||
|
// repeated Item items = 1 [experimental_map_key="name"]; |
||||||
|
// } |
||||||
|
// In this situation, the map key for Item will be set to "name". |
||||||
|
// TODO: Fully-implement this, then remove the "experimental_" prefix. |
||||||
|
optional string experimental_map_key = 9; |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message EnumOptions { |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message EnumValueOptions { |
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message ServiceOptions { |
||||||
|
|
||||||
|
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC |
||||||
|
// framework. We apologize for hoarding these numbers to ourselves, but |
||||||
|
// we were already using them long before we decided to release Protocol |
||||||
|
// Buffers. |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message MethodOptions { |
||||||
|
|
||||||
|
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC |
||||||
|
// framework. We apologize for hoarding these numbers to ourselves, but |
||||||
|
// we were already using them long before we decided to release Protocol |
||||||
|
// Buffers. |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
// A message representing a option the parser does not recognize. This only |
||||||
|
// appears in options protos created by the compiler::Parser class. |
||||||
|
// DescriptorPool resolves these when building Descriptor objects. Therefore, |
||||||
|
// options protos in descriptor objects (e.g. returned by Descriptor::options(), |
||||||
|
// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions |
||||||
|
// in them. |
||||||
|
message UninterpretedOption { |
||||||
|
// The name of the uninterpreted option. Each string represents a segment in |
||||||
|
// a dot-separated name. is_extension is true iff a segment represents an |
||||||
|
// extension (denoted with parentheses in options specs in .proto files). |
||||||
|
// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents |
||||||
|
// "foo.(bar.baz).qux". |
||||||
|
message NamePart { |
||||||
|
required string name_part = 1; |
||||||
|
required bool is_extension = 2; |
||||||
|
} |
||||||
|
repeated NamePart name = 2; |
||||||
|
|
||||||
|
// The value of the uninterpreted option, in whatever type the tokenizer |
||||||
|
// identified it as during parsing. Exactly one of these should be set. |
||||||
|
optional string identifier_value = 3; |
||||||
|
optional uint64 positive_int_value = 4; |
||||||
|
optional int64 negative_int_value = 5; |
||||||
|
optional double double_value = 6; |
||||||
|
optional bytes string_value = 7; |
||||||
|
optional string aggregate_value = 8; |
||||||
|
} |
||||||
|
|
||||||
|
// =================================================================== |
||||||
|
// Optional source code info |
||||||
|
|
||||||
|
// Encapsulates information about the original source file from which a |
||||||
|
// FileDescriptorProto was generated. |
||||||
|
message SourceCodeInfo { |
||||||
|
// A Location identifies a piece of source code in a .proto file which |
||||||
|
// corresponds to a particular definition. This information is intended |
||||||
|
// to be useful to IDEs, code indexers, documentation generators, and similar |
||||||
|
// tools. |
||||||
|
// |
||||||
|
// For example, say we have a file like: |
||||||
|
// message Foo { |
||||||
|
// optional string foo = 1; |
||||||
|
// } |
||||||
|
// Let's look at just the field definition: |
||||||
|
// optional string foo = 1; |
||||||
|
// ^ ^^ ^^ ^ ^^^ |
||||||
|
// a bc de f ghi |
||||||
|
// We have the following locations: |
||||||
|
// span path represents |
||||||
|
// [a,i) [ 4, 0, 2, 0 ] The whole field definition. |
||||||
|
// [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). |
||||||
|
// [c,d) [ 4, 0, 2, 0, 5 ] The type (string). |
||||||
|
// [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). |
||||||
|
// [g,h) [ 4, 0, 2, 0, 3 ] The number (1). |
||||||
|
// |
||||||
|
// Notes: |
||||||
|
// - A location may refer to a repeated field itself (i.e. not to any |
||||||
|
// particular index within it). This is used whenever a set of elements are |
||||||
|
// logically enclosed in a single code segment. For example, an entire |
||||||
|
// extend block (possibly containing multiple extension definitions) will |
||||||
|
// have an outer location whose path refers to the "extensions" repeated |
||||||
|
// field without an index. |
||||||
|
// - Multiple locations may have the same path. This happens when a single |
||||||
|
// logical declaration is spread out across multiple places. The most |
||||||
|
// obvious example is the "extend" block again -- there may be multiple |
||||||
|
// extend blocks in the same scope, each of which will have the same path. |
||||||
|
// - A location's span is not always a subset of its parent's span. For |
||||||
|
// example, the "extendee" of an extension declaration appears at the |
||||||
|
// beginning of the "extend" block and is shared by all extensions within |
||||||
|
// the block. |
||||||
|
// - Just because a location's span is a subset of some other location's span |
||||||
|
// does not mean that it is a descendent. For example, a "group" defines |
||||||
|
// both a type and a field in a single declaration. Thus, the locations |
||||||
|
// corresponding to the type and field and their components will overlap. |
||||||
|
// - Code which tries to interpret locations should probably be designed to |
||||||
|
// ignore those that it doesn't understand, as more types of locations could |
||||||
|
// be recorded in the future. |
||||||
|
repeated Location location = 1; |
||||||
|
message Location { |
||||||
|
// Identifies which part of the FileDescriptorProto was defined at this |
||||||
|
// location. |
||||||
|
// |
||||||
|
// Each element is a field number or an index. They form a path from |
||||||
|
// the root FileDescriptorProto to the place where the definition. For |
||||||
|
// example, this path: |
||||||
|
// [ 4, 3, 2, 7, 1 ] |
||||||
|
// refers to: |
||||||
|
// file.message_type(3) // 4, 3 |
||||||
|
// .field(7) // 2, 7 |
||||||
|
// .name() // 1 |
||||||
|
// This is because FileDescriptorProto.message_type has field number 4: |
||||||
|
// repeated DescriptorProto message_type = 4; |
||||||
|
// and DescriptorProto.field has field number 2: |
||||||
|
// repeated FieldDescriptorProto field = 2; |
||||||
|
// and FieldDescriptorProto.name has field number 1: |
||||||
|
// optional string name = 1; |
||||||
|
// |
||||||
|
// Thus, the above path gives the location of a field name. If we removed |
||||||
|
// the last element: |
||||||
|
// [ 4, 3, 2, 7 ] |
||||||
|
// this path refers to the whole field declaration (from the beginning |
||||||
|
// of the label to the terminating semicolon). |
||||||
|
repeated int32 path = 1 [packed=true]; |
||||||
|
|
||||||
|
// Always has exactly three or four elements: start line, start column, |
||||||
|
// end line (optional, otherwise assumed same as start line), end column. |
||||||
|
// These are packed into a single field for efficiency. Note that line |
||||||
|
// and column numbers are zero-based -- typically you will want to add |
||||||
|
// 1 to each before displaying to a user. |
||||||
|
repeated int32 span = 2 [packed=true]; |
||||||
|
|
||||||
|
// TODO(kenton): Record comments appearing before and after the |
||||||
|
// declaration. |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,636 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// Based on original Protocol Buffers design by |
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others. |
||||||
|
// |
||||||
|
// A proto file we will use for unit testing. |
||||||
|
|
||||||
|
|
||||||
|
// Some generic_services option(s) added automatically. |
||||||
|
// See: http://go/proto2-generic-services-default |
||||||
|
option cc_generic_services = true; // auto-added |
||||||
|
option java_generic_services = true; // auto-added |
||||||
|
option py_generic_services = true; // auto-added |
||||||
|
|
||||||
|
import "google/protobuf/unittest_import.proto"; |
||||||
|
|
||||||
|
// We don't put this in a package within proto2 because we need to make sure |
||||||
|
// that the generated code doesn't depend on being in the proto2 namespace. |
||||||
|
// In test_util.h we do "using namespace unittest = protobuf_unittest". |
||||||
|
package protobuf_unittest; |
||||||
|
|
||||||
|
// Protos optimized for SPEED use a strict superset of the generated code |
||||||
|
// of equivalent ones optimized for CODE_SIZE, so we should optimize all our |
||||||
|
// tests for speed unless explicitly testing code size optimization. |
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
option java_outer_classname = "UnittestProto"; |
||||||
|
|
||||||
|
// This proto includes every type of field in both singular and repeated |
||||||
|
// forms. |
||||||
|
message TestAllTypes { |
||||||
|
message NestedMessage { |
||||||
|
// The field name "b" fails to compile in proto1 because it conflicts with |
||||||
|
// a local variable named "b" in one of the generated methods. Doh. |
||||||
|
// This file needs to compile in proto1 to test backwards-compatibility. |
||||||
|
optional int32 bb = 1; |
||||||
|
} |
||||||
|
|
||||||
|
enum NestedEnum { |
||||||
|
FOO = 1; |
||||||
|
BAR = 2; |
||||||
|
BAZ = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Singular |
||||||
|
optional int32 optional_int32 = 1; |
||||||
|
optional int64 optional_int64 = 2; |
||||||
|
optional uint32 optional_uint32 = 3; |
||||||
|
optional uint64 optional_uint64 = 4; |
||||||
|
optional sint32 optional_sint32 = 5; |
||||||
|
optional sint64 optional_sint64 = 6; |
||||||
|
optional fixed32 optional_fixed32 = 7; |
||||||
|
optional fixed64 optional_fixed64 = 8; |
||||||
|
optional sfixed32 optional_sfixed32 = 9; |
||||||
|
optional sfixed64 optional_sfixed64 = 10; |
||||||
|
optional float optional_float = 11; |
||||||
|
optional double optional_double = 12; |
||||||
|
optional bool optional_bool = 13; |
||||||
|
optional string optional_string = 14; |
||||||
|
optional bytes optional_bytes = 15; |
||||||
|
|
||||||
|
optional group OptionalGroup = 16 { |
||||||
|
optional int32 a = 17; |
||||||
|
} |
||||||
|
|
||||||
|
optional NestedMessage optional_nested_message = 18; |
||||||
|
optional ForeignMessage optional_foreign_message = 19; |
||||||
|
optional protobuf_unittest_import.ImportMessage optional_import_message = 20; |
||||||
|
|
||||||
|
optional NestedEnum optional_nested_enum = 21; |
||||||
|
optional ForeignEnum optional_foreign_enum = 22; |
||||||
|
optional protobuf_unittest_import.ImportEnum optional_import_enum = 23; |
||||||
|
|
||||||
|
optional string optional_string_piece = 24 [ctype=STRING_PIECE]; |
||||||
|
optional string optional_cord = 25 [ctype=CORD]; |
||||||
|
|
||||||
|
// Repeated |
||||||
|
repeated int32 repeated_int32 = 31; |
||||||
|
repeated int64 repeated_int64 = 32; |
||||||
|
repeated uint32 repeated_uint32 = 33; |
||||||
|
repeated uint64 repeated_uint64 = 34; |
||||||
|
repeated sint32 repeated_sint32 = 35; |
||||||
|
repeated sint64 repeated_sint64 = 36; |
||||||
|
repeated fixed32 repeated_fixed32 = 37; |
||||||
|
repeated fixed64 repeated_fixed64 = 38; |
||||||
|
repeated sfixed32 repeated_sfixed32 = 39; |
||||||
|
repeated sfixed64 repeated_sfixed64 = 40; |
||||||
|
repeated float repeated_float = 41; |
||||||
|
repeated double repeated_double = 42; |
||||||
|
repeated bool repeated_bool = 43; |
||||||
|
repeated string repeated_string = 44; |
||||||
|
repeated bytes repeated_bytes = 45; |
||||||
|
|
||||||
|
repeated group RepeatedGroup = 46 { |
||||||
|
optional int32 a = 47; |
||||||
|
} |
||||||
|
|
||||||
|
repeated NestedMessage repeated_nested_message = 48; |
||||||
|
repeated ForeignMessage repeated_foreign_message = 49; |
||||||
|
repeated protobuf_unittest_import.ImportMessage repeated_import_message = 50; |
||||||
|
|
||||||
|
repeated NestedEnum repeated_nested_enum = 51; |
||||||
|
repeated ForeignEnum repeated_foreign_enum = 52; |
||||||
|
repeated protobuf_unittest_import.ImportEnum repeated_import_enum = 53; |
||||||
|
|
||||||
|
repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; |
||||||
|
repeated string repeated_cord = 55 [ctype=CORD]; |
||||||
|
|
||||||
|
// Singular with defaults |
||||||
|
optional int32 default_int32 = 61 [default = 41 ]; |
||||||
|
optional int64 default_int64 = 62 [default = 42 ]; |
||||||
|
optional uint32 default_uint32 = 63 [default = 43 ]; |
||||||
|
optional uint64 default_uint64 = 64 [default = 44 ]; |
||||||
|
optional sint32 default_sint32 = 65 [default = -45 ]; |
||||||
|
optional sint64 default_sint64 = 66 [default = 46 ]; |
||||||
|
optional fixed32 default_fixed32 = 67 [default = 47 ]; |
||||||
|
optional fixed64 default_fixed64 = 68 [default = 48 ]; |
||||||
|
optional sfixed32 default_sfixed32 = 69 [default = 49 ]; |
||||||
|
optional sfixed64 default_sfixed64 = 70 [default = -50 ]; |
||||||
|
optional float default_float = 71 [default = 51.5 ]; |
||||||
|
optional double default_double = 72 [default = 52e3 ]; |
||||||
|
optional bool default_bool = 73 [default = true ]; |
||||||
|
optional string default_string = 74 [default = "hello"]; |
||||||
|
optional bytes default_bytes = 75 [default = "world"]; |
||||||
|
|
||||||
|
optional NestedEnum default_nested_enum = 81 [default = BAR ]; |
||||||
|
optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR]; |
||||||
|
optional protobuf_unittest_import.ImportEnum |
||||||
|
default_import_enum = 83 [default = IMPORT_BAR]; |
||||||
|
|
||||||
|
optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; |
||||||
|
optional string default_cord = 85 [ctype=CORD,default="123"]; |
||||||
|
} |
||||||
|
|
||||||
|
message TestDeprecatedFields { |
||||||
|
optional int32 deprecated_int32 = 1 [deprecated=true]; |
||||||
|
} |
||||||
|
|
||||||
|
// Define these after TestAllTypes to make sure the compiler can handle |
||||||
|
// that. |
||||||
|
message ForeignMessage { |
||||||
|
optional int32 c = 1; |
||||||
|
} |
||||||
|
|
||||||
|
enum ForeignEnum { |
||||||
|
FOREIGN_FOO = 4; |
||||||
|
FOREIGN_BAR = 5; |
||||||
|
FOREIGN_BAZ = 6; |
||||||
|
} |
||||||
|
|
||||||
|
message TestAllExtensions { |
||||||
|
extensions 1 to max; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestAllExtensions { |
||||||
|
// Singular |
||||||
|
optional int32 optional_int32_extension = 1; |
||||||
|
optional int64 optional_int64_extension = 2; |
||||||
|
optional uint32 optional_uint32_extension = 3; |
||||||
|
optional uint64 optional_uint64_extension = 4; |
||||||
|
optional sint32 optional_sint32_extension = 5; |
||||||
|
optional sint64 optional_sint64_extension = 6; |
||||||
|
optional fixed32 optional_fixed32_extension = 7; |
||||||
|
optional fixed64 optional_fixed64_extension = 8; |
||||||
|
optional sfixed32 optional_sfixed32_extension = 9; |
||||||
|
optional sfixed64 optional_sfixed64_extension = 10; |
||||||
|
optional float optional_float_extension = 11; |
||||||
|
optional double optional_double_extension = 12; |
||||||
|
optional bool optional_bool_extension = 13; |
||||||
|
optional string optional_string_extension = 14; |
||||||
|
optional bytes optional_bytes_extension = 15; |
||||||
|
|
||||||
|
optional group OptionalGroup_extension = 16 { |
||||||
|
optional int32 a = 17; |
||||||
|
} |
||||||
|
|
||||||
|
optional TestAllTypes.NestedMessage optional_nested_message_extension = 18; |
||||||
|
optional ForeignMessage optional_foreign_message_extension = 19; |
||||||
|
optional protobuf_unittest_import.ImportMessage |
||||||
|
optional_import_message_extension = 20; |
||||||
|
|
||||||
|
optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21; |
||||||
|
optional ForeignEnum optional_foreign_enum_extension = 22; |
||||||
|
optional protobuf_unittest_import.ImportEnum |
||||||
|
optional_import_enum_extension = 23; |
||||||
|
|
||||||
|
optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE]; |
||||||
|
optional string optional_cord_extension = 25 [ctype=CORD]; |
||||||
|
|
||||||
|
// Repeated |
||||||
|
repeated int32 repeated_int32_extension = 31; |
||||||
|
repeated int64 repeated_int64_extension = 32; |
||||||
|
repeated uint32 repeated_uint32_extension = 33; |
||||||
|
repeated uint64 repeated_uint64_extension = 34; |
||||||
|
repeated sint32 repeated_sint32_extension = 35; |
||||||
|
repeated sint64 repeated_sint64_extension = 36; |
||||||
|
repeated fixed32 repeated_fixed32_extension = 37; |
||||||
|
repeated fixed64 repeated_fixed64_extension = 38; |
||||||
|
repeated sfixed32 repeated_sfixed32_extension = 39; |
||||||
|
repeated sfixed64 repeated_sfixed64_extension = 40; |
||||||
|
repeated float repeated_float_extension = 41; |
||||||
|
repeated double repeated_double_extension = 42; |
||||||
|
repeated bool repeated_bool_extension = 43; |
||||||
|
repeated string repeated_string_extension = 44; |
||||||
|
repeated bytes repeated_bytes_extension = 45; |
||||||
|
|
||||||
|
repeated group RepeatedGroup_extension = 46 { |
||||||
|
optional int32 a = 47; |
||||||
|
} |
||||||
|
|
||||||
|
repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48; |
||||||
|
repeated ForeignMessage repeated_foreign_message_extension = 49; |
||||||
|
repeated protobuf_unittest_import.ImportMessage |
||||||
|
repeated_import_message_extension = 50; |
||||||
|
|
||||||
|
repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51; |
||||||
|
repeated ForeignEnum repeated_foreign_enum_extension = 52; |
||||||
|
repeated protobuf_unittest_import.ImportEnum |
||||||
|
repeated_import_enum_extension = 53; |
||||||
|
|
||||||
|
repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE]; |
||||||
|
repeated string repeated_cord_extension = 55 [ctype=CORD]; |
||||||
|
|
||||||
|
// Singular with defaults |
||||||
|
optional int32 default_int32_extension = 61 [default = 41 ]; |
||||||
|
optional int64 default_int64_extension = 62 [default = 42 ]; |
||||||
|
optional uint32 default_uint32_extension = 63 [default = 43 ]; |
||||||
|
optional uint64 default_uint64_extension = 64 [default = 44 ]; |
||||||
|
optional sint32 default_sint32_extension = 65 [default = -45 ]; |
||||||
|
optional sint64 default_sint64_extension = 66 [default = 46 ]; |
||||||
|
optional fixed32 default_fixed32_extension = 67 [default = 47 ]; |
||||||
|
optional fixed64 default_fixed64_extension = 68 [default = 48 ]; |
||||||
|
optional sfixed32 default_sfixed32_extension = 69 [default = 49 ]; |
||||||
|
optional sfixed64 default_sfixed64_extension = 70 [default = -50 ]; |
||||||
|
optional float default_float_extension = 71 [default = 51.5 ]; |
||||||
|
optional double default_double_extension = 72 [default = 52e3 ]; |
||||||
|
optional bool default_bool_extension = 73 [default = true ]; |
||||||
|
optional string default_string_extension = 74 [default = "hello"]; |
||||||
|
optional bytes default_bytes_extension = 75 [default = "world"]; |
||||||
|
|
||||||
|
optional TestAllTypes.NestedEnum |
||||||
|
default_nested_enum_extension = 81 [default = BAR]; |
||||||
|
optional ForeignEnum |
||||||
|
default_foreign_enum_extension = 82 [default = FOREIGN_BAR]; |
||||||
|
optional protobuf_unittest_import.ImportEnum |
||||||
|
default_import_enum_extension = 83 [default = IMPORT_BAR]; |
||||||
|
|
||||||
|
optional string default_string_piece_extension = 84 [ctype=STRING_PIECE, |
||||||
|
default="abc"]; |
||||||
|
optional string default_cord_extension = 85 [ctype=CORD, default="123"]; |
||||||
|
} |
||||||
|
|
||||||
|
message TestNestedExtension { |
||||||
|
extend TestAllExtensions { |
||||||
|
// Check for bug where string extensions declared in tested scope did not |
||||||
|
// compile. |
||||||
|
optional string test = 1002 [default="test"]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// We have separate messages for testing required fields because it's |
||||||
|
// annoying to have to fill in required fields in TestProto in order to |
||||||
|
// do anything with it. Note that we don't need to test every type of |
||||||
|
// required filed because the code output is basically identical to |
||||||
|
// optional fields for all types. |
||||||
|
message TestRequired { |
||||||
|
required int32 a = 1; |
||||||
|
optional int32 dummy2 = 2; |
||||||
|
required int32 b = 3; |
||||||
|
|
||||||
|
extend TestAllExtensions { |
||||||
|
optional TestRequired single = 1000; |
||||||
|
repeated TestRequired multi = 1001; |
||||||
|
} |
||||||
|
|
||||||
|
// Pad the field count to 32 so that we can test that IsInitialized() |
||||||
|
// properly checks multiple elements of has_bits_. |
||||||
|
optional int32 dummy4 = 4; |
||||||
|
optional int32 dummy5 = 5; |
||||||
|
optional int32 dummy6 = 6; |
||||||
|
optional int32 dummy7 = 7; |
||||||
|
optional int32 dummy8 = 8; |
||||||
|
optional int32 dummy9 = 9; |
||||||
|
optional int32 dummy10 = 10; |
||||||
|
optional int32 dummy11 = 11; |
||||||
|
optional int32 dummy12 = 12; |
||||||
|
optional int32 dummy13 = 13; |
||||||
|
optional int32 dummy14 = 14; |
||||||
|
optional int32 dummy15 = 15; |
||||||
|
optional int32 dummy16 = 16; |
||||||
|
optional int32 dummy17 = 17; |
||||||
|
optional int32 dummy18 = 18; |
||||||
|
optional int32 dummy19 = 19; |
||||||
|
optional int32 dummy20 = 20; |
||||||
|
optional int32 dummy21 = 21; |
||||||
|
optional int32 dummy22 = 22; |
||||||
|
optional int32 dummy23 = 23; |
||||||
|
optional int32 dummy24 = 24; |
||||||
|
optional int32 dummy25 = 25; |
||||||
|
optional int32 dummy26 = 26; |
||||||
|
optional int32 dummy27 = 27; |
||||||
|
optional int32 dummy28 = 28; |
||||||
|
optional int32 dummy29 = 29; |
||||||
|
optional int32 dummy30 = 30; |
||||||
|
optional int32 dummy31 = 31; |
||||||
|
optional int32 dummy32 = 32; |
||||||
|
|
||||||
|
required int32 c = 33; |
||||||
|
} |
||||||
|
|
||||||
|
message TestRequiredForeign { |
||||||
|
optional TestRequired optional_message = 1; |
||||||
|
repeated TestRequired repeated_message = 2; |
||||||
|
optional int32 dummy = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Test that we can use NestedMessage from outside TestAllTypes. |
||||||
|
message TestForeignNested { |
||||||
|
optional TestAllTypes.NestedMessage foreign_nested = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// TestEmptyMessage is used to test unknown field support. |
||||||
|
message TestEmptyMessage { |
||||||
|
} |
||||||
|
|
||||||
|
// Like above, but declare all field numbers as potential extensions. No |
||||||
|
// actual extensions should ever be defined for this type. |
||||||
|
message TestEmptyMessageWithExtensions { |
||||||
|
extensions 1 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message TestMultipleExtensionRanges { |
||||||
|
extensions 42; |
||||||
|
extensions 4143 to 4243; |
||||||
|
extensions 65536 to max; |
||||||
|
} |
||||||
|
|
||||||
|
// Test that really large tag numbers don't break anything. |
||||||
|
message TestReallyLargeTagNumber { |
||||||
|
// The largest possible tag number is 2^28 - 1, since the wire format uses |
||||||
|
// three bits to communicate wire type. |
||||||
|
optional int32 a = 1; |
||||||
|
optional int32 bb = 268435455; |
||||||
|
} |
||||||
|
|
||||||
|
message TestRecursiveMessage { |
||||||
|
optional TestRecursiveMessage a = 1; |
||||||
|
optional int32 i = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// Test that mutual recursion works. |
||||||
|
message TestMutualRecursionA { |
||||||
|
optional TestMutualRecursionB bb = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message TestMutualRecursionB { |
||||||
|
optional TestMutualRecursionA a = 1; |
||||||
|
optional int32 optional_int32 = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// Test that groups have disjoint field numbers from their siblings and |
||||||
|
// parents. This is NOT possible in proto1; only proto2. When attempting |
||||||
|
// to compile with proto1, this will emit an error; so we only include it |
||||||
|
// in protobuf_unittest_proto. |
||||||
|
message TestDupFieldNumber { // NO_PROTO1 |
||||||
|
optional int32 a = 1; // NO_PROTO1 |
||||||
|
optional group Foo = 2 { optional int32 a = 1; } // NO_PROTO1 |
||||||
|
optional group Bar = 3 { optional int32 a = 1; } // NO_PROTO1 |
||||||
|
} // NO_PROTO1 |
||||||
|
|
||||||
|
|
||||||
|
// Needed for a Python test. |
||||||
|
message TestNestedMessageHasBits { |
||||||
|
message NestedMessage { |
||||||
|
repeated int32 nestedmessage_repeated_int32 = 1; |
||||||
|
repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2; |
||||||
|
} |
||||||
|
optional NestedMessage optional_nested_message = 1; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// Test an enum that has multiple values with the same number. |
||||||
|
enum TestEnumWithDupValue { |
||||||
|
FOO1 = 1; |
||||||
|
BAR1 = 2; |
||||||
|
BAZ = 3; |
||||||
|
FOO2 = 1; |
||||||
|
BAR2 = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// Test an enum with large, unordered values. |
||||||
|
enum TestSparseEnum { |
||||||
|
SPARSE_A = 123; |
||||||
|
SPARSE_B = 62374; |
||||||
|
SPARSE_C = 12589234; |
||||||
|
SPARSE_D = -15; |
||||||
|
SPARSE_E = -53452; |
||||||
|
SPARSE_F = 0; |
||||||
|
SPARSE_G = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// Test message with CamelCase field names. This violates Protocol Buffer |
||||||
|
// standard style. |
||||||
|
message TestCamelCaseFieldNames { |
||||||
|
optional int32 PrimitiveField = 1; |
||||||
|
optional string StringField = 2; |
||||||
|
optional ForeignEnum EnumField = 3; |
||||||
|
optional ForeignMessage MessageField = 4; |
||||||
|
optional string StringPieceField = 5 [ctype=STRING_PIECE]; |
||||||
|
optional string CordField = 6 [ctype=CORD]; |
||||||
|
|
||||||
|
repeated int32 RepeatedPrimitiveField = 7; |
||||||
|
repeated string RepeatedStringField = 8; |
||||||
|
repeated ForeignEnum RepeatedEnumField = 9; |
||||||
|
repeated ForeignMessage RepeatedMessageField = 10; |
||||||
|
repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE]; |
||||||
|
repeated string RepeatedCordField = 12 [ctype=CORD]; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// We list fields out of order, to ensure that we're using field number and not |
||||||
|
// field index to determine serialization order. |
||||||
|
message TestFieldOrderings { |
||||||
|
optional string my_string = 11; |
||||||
|
extensions 2 to 10; |
||||||
|
optional int64 my_int = 1; |
||||||
|
extensions 12 to 100; |
||||||
|
optional float my_float = 101; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
extend TestFieldOrderings { |
||||||
|
optional string my_extension_string = 50; |
||||||
|
optional int32 my_extension_int = 5; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
message TestExtremeDefaultValues { |
||||||
|
optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"]; |
||||||
|
optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF]; |
||||||
|
optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF]; |
||||||
|
optional int32 small_int32 = 4 [default = -0x7FFFFFFF]; |
||||||
|
optional int64 small_int64 = 5 [default = -0x7FFFFFFFFFFFFFFF]; |
||||||
|
|
||||||
|
// The default value here is UTF-8 for "\u1234". (We could also just type |
||||||
|
// the UTF-8 text directly into this text file rather than escape it, but |
||||||
|
// lots of people use editors that would be confused by this.) |
||||||
|
optional string utf8_string = 6 [default = "\341\210\264"]; |
||||||
|
|
||||||
|
// Tests for single-precision floating-point values. |
||||||
|
optional float zero_float = 7 [default = 0]; |
||||||
|
optional float one_float = 8 [default = 1]; |
||||||
|
optional float small_float = 9 [default = 1.5]; |
||||||
|
optional float negative_one_float = 10 [default = -1]; |
||||||
|
optional float negative_float = 11 [default = -1.5]; |
||||||
|
// Using exponents |
||||||
|
optional float large_float = 12 [default = 2E8]; |
||||||
|
optional float small_negative_float = 13 [default = -8e-28]; |
||||||
|
|
||||||
|
// Text for nonfinite floating-point values. |
||||||
|
optional double inf_double = 14 [default = inf]; |
||||||
|
optional double neg_inf_double = 15 [default = -inf]; |
||||||
|
optional double nan_double = 16 [default = nan]; |
||||||
|
optional float inf_float = 17 [default = inf]; |
||||||
|
optional float neg_inf_float = 18 [default = -inf]; |
||||||
|
optional float nan_float = 19 [default = nan]; |
||||||
|
|
||||||
|
// Tests for C++ trigraphs. |
||||||
|
// Trigraphs should be escaped in C++ generated files, but they should not be |
||||||
|
// escaped for other languages. |
||||||
|
// Note that in .proto file, "\?" is a valid way to escape ? in string |
||||||
|
// literals. |
||||||
|
optional string cpp_trigraph = 20 [default = "? \? ?? \?? \??? ??/ ?\?-"]; |
||||||
|
} |
||||||
|
|
||||||
|
message SparseEnumMessage { |
||||||
|
optional TestSparseEnum sparse_enum = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// Test String and Bytes: string is for valid UTF-8 strings |
||||||
|
message OneString { |
||||||
|
optional string data = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message OneBytes { |
||||||
|
optional bytes data = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// Test messages for packed fields |
||||||
|
|
||||||
|
message TestPackedTypes { |
||||||
|
repeated int32 packed_int32 = 90 [packed = true]; |
||||||
|
repeated int64 packed_int64 = 91 [packed = true]; |
||||||
|
repeated uint32 packed_uint32 = 92 [packed = true]; |
||||||
|
repeated uint64 packed_uint64 = 93 [packed = true]; |
||||||
|
repeated sint32 packed_sint32 = 94 [packed = true]; |
||||||
|
repeated sint64 packed_sint64 = 95 [packed = true]; |
||||||
|
repeated fixed32 packed_fixed32 = 96 [packed = true]; |
||||||
|
repeated fixed64 packed_fixed64 = 97 [packed = true]; |
||||||
|
repeated sfixed32 packed_sfixed32 = 98 [packed = true]; |
||||||
|
repeated sfixed64 packed_sfixed64 = 99 [packed = true]; |
||||||
|
repeated float packed_float = 100 [packed = true]; |
||||||
|
repeated double packed_double = 101 [packed = true]; |
||||||
|
repeated bool packed_bool = 102 [packed = true]; |
||||||
|
repeated ForeignEnum packed_enum = 103 [packed = true]; |
||||||
|
} |
||||||
|
|
||||||
|
// A message with the same fields as TestPackedTypes, but without packing. Used |
||||||
|
// to test packed <-> unpacked wire compatibility. |
||||||
|
message TestUnpackedTypes { |
||||||
|
repeated int32 unpacked_int32 = 90 [packed = false]; |
||||||
|
repeated int64 unpacked_int64 = 91 [packed = false]; |
||||||
|
repeated uint32 unpacked_uint32 = 92 [packed = false]; |
||||||
|
repeated uint64 unpacked_uint64 = 93 [packed = false]; |
||||||
|
repeated sint32 unpacked_sint32 = 94 [packed = false]; |
||||||
|
repeated sint64 unpacked_sint64 = 95 [packed = false]; |
||||||
|
repeated fixed32 unpacked_fixed32 = 96 [packed = false]; |
||||||
|
repeated fixed64 unpacked_fixed64 = 97 [packed = false]; |
||||||
|
repeated sfixed32 unpacked_sfixed32 = 98 [packed = false]; |
||||||
|
repeated sfixed64 unpacked_sfixed64 = 99 [packed = false]; |
||||||
|
repeated float unpacked_float = 100 [packed = false]; |
||||||
|
repeated double unpacked_double = 101 [packed = false]; |
||||||
|
repeated bool unpacked_bool = 102 [packed = false]; |
||||||
|
repeated ForeignEnum unpacked_enum = 103 [packed = false]; |
||||||
|
} |
||||||
|
|
||||||
|
message TestPackedExtensions { |
||||||
|
extensions 1 to max; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestPackedExtensions { |
||||||
|
repeated int32 packed_int32_extension = 90 [packed = true]; |
||||||
|
repeated int64 packed_int64_extension = 91 [packed = true]; |
||||||
|
repeated uint32 packed_uint32_extension = 92 [packed = true]; |
||||||
|
repeated uint64 packed_uint64_extension = 93 [packed = true]; |
||||||
|
repeated sint32 packed_sint32_extension = 94 [packed = true]; |
||||||
|
repeated sint64 packed_sint64_extension = 95 [packed = true]; |
||||||
|
repeated fixed32 packed_fixed32_extension = 96 [packed = true]; |
||||||
|
repeated fixed64 packed_fixed64_extension = 97 [packed = true]; |
||||||
|
repeated sfixed32 packed_sfixed32_extension = 98 [packed = true]; |
||||||
|
repeated sfixed64 packed_sfixed64_extension = 99 [packed = true]; |
||||||
|
repeated float packed_float_extension = 100 [packed = true]; |
||||||
|
repeated double packed_double_extension = 101 [packed = true]; |
||||||
|
repeated bool packed_bool_extension = 102 [packed = true]; |
||||||
|
repeated ForeignEnum packed_enum_extension = 103 [packed = true]; |
||||||
|
} |
||||||
|
|
||||||
|
// Used by ExtensionSetTest/DynamicExtensions. The test actually builds |
||||||
|
// a set of extensions to TestAllExtensions dynamically, based on the fields |
||||||
|
// of this message type. |
||||||
|
message TestDynamicExtensions { |
||||||
|
enum DynamicEnumType { |
||||||
|
DYNAMIC_FOO = 2200; |
||||||
|
DYNAMIC_BAR = 2201; |
||||||
|
DYNAMIC_BAZ = 2202; |
||||||
|
} |
||||||
|
message DynamicMessageType { |
||||||
|
optional int32 dynamic_field = 2100; |
||||||
|
} |
||||||
|
|
||||||
|
optional fixed32 scalar_extension = 2000; |
||||||
|
optional ForeignEnum enum_extension = 2001; |
||||||
|
optional DynamicEnumType dynamic_enum_extension = 2002; |
||||||
|
|
||||||
|
optional ForeignMessage message_extension = 2003; |
||||||
|
optional DynamicMessageType dynamic_message_extension = 2004; |
||||||
|
|
||||||
|
repeated string repeated_extension = 2005; |
||||||
|
repeated sint32 packed_extension = 2006 [packed = true]; |
||||||
|
} |
||||||
|
|
||||||
|
message TestRepeatedScalarDifferentTagSizes { |
||||||
|
// Parsing repeated fixed size values used to fail. This message needs to be |
||||||
|
// used in order to get a tag of the right size; all of the repeated fields |
||||||
|
// in TestAllTypes didn't trigger the check. |
||||||
|
repeated fixed32 repeated_fixed32 = 12; |
||||||
|
// Check for a varint type, just for good measure. |
||||||
|
repeated int32 repeated_int32 = 13; |
||||||
|
|
||||||
|
// These have two-byte tags. |
||||||
|
repeated fixed64 repeated_fixed64 = 2046; |
||||||
|
repeated int64 repeated_int64 = 2047; |
||||||
|
|
||||||
|
// Three byte tags. |
||||||
|
repeated float repeated_float = 262142; |
||||||
|
repeated uint64 repeated_uint64 = 262143; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// Test that RPC services work. |
||||||
|
message FooRequest {} |
||||||
|
message FooResponse {} |
||||||
|
|
||||||
|
service TestService { |
||||||
|
rpc Foo(FooRequest) returns (FooResponse); |
||||||
|
rpc Bar(BarRequest) returns (BarResponse); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
message BarRequest {} |
||||||
|
message BarResponse {} |
@ -0,0 +1,52 @@ |
|||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: jonskeet@google.com (Jon Skeet) |
||||||
|
// |
||||||
|
// A proto file for unit testing the custom C# options |
||||||
|
|
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestCSharpOptionsProtoFile"; |
||||||
|
//option (google.protobuf.csharp_file_options).nest_classes = true; |
||||||
|
|
||||||
|
package protobuf_unittest; |
||||||
|
|
||||||
|
message OptionsMessage { |
||||||
|
|
||||||
|
// Will be left as Normal |
||||||
|
optional string normal = 1; |
||||||
|
|
||||||
|
// Will be converted to OptionsMessage_ |
||||||
|
optional string options_message = 2; |
||||||
|
|
||||||
|
// Will be converted to CustomName |
||||||
|
optional string customized = 3 [(google.protobuf.csharp_field_options).property_name = "CustomName"]; |
||||||
|
} |
@ -0,0 +1,372 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestCustomOptionsProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: benjy@google.com (Benjy Weinberger) |
||||||
|
// Based on original Protocol Buffers design by |
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others. |
||||||
|
// |
||||||
|
// A proto file used to test the "custom options" feature of proto2. |
||||||
|
|
||||||
|
|
||||||
|
// Some generic_services option(s) added automatically. |
||||||
|
// See: http://go/proto2-generic-services-default |
||||||
|
option cc_generic_services = true; // auto-added |
||||||
|
option java_generic_services = true; // auto-added |
||||||
|
option py_generic_services = true; |
||||||
|
|
||||||
|
// A custom file option (defined below). |
||||||
|
option (file_opt1) = 9876543210; |
||||||
|
|
||||||
|
import "google/protobuf/descriptor.proto"; |
||||||
|
|
||||||
|
// We don't put this in a package within proto2 because we need to make sure |
||||||
|
// that the generated code doesn't depend on being in the proto2 namespace. |
||||||
|
package protobuf_unittest; |
||||||
|
|
||||||
|
|
||||||
|
// Some simple test custom options of various types. |
||||||
|
|
||||||
|
extend google.protobuf.FileOptions { |
||||||
|
optional uint64 file_opt1 = 7736974; |
||||||
|
} |
||||||
|
|
||||||
|
extend google.protobuf.MessageOptions { |
||||||
|
optional int32 message_opt1 = 7739036; |
||||||
|
} |
||||||
|
|
||||||
|
extend google.protobuf.FieldOptions { |
||||||
|
optional fixed64 field_opt1 = 7740936; |
||||||
|
// This is useful for testing that we correctly register default values for |
||||||
|
// extension options. |
||||||
|
optional int32 field_opt2 = 7753913 [default=42]; |
||||||
|
} |
||||||
|
|
||||||
|
extend google.protobuf.EnumOptions { |
||||||
|
optional sfixed32 enum_opt1 = 7753576; |
||||||
|
} |
||||||
|
|
||||||
|
extend google.protobuf.EnumValueOptions { |
||||||
|
optional int32 enum_value_opt1 = 1560678; |
||||||
|
} |
||||||
|
|
||||||
|
extend google.protobuf.ServiceOptions { |
||||||
|
optional sint64 service_opt1 = 7887650; |
||||||
|
} |
||||||
|
|
||||||
|
enum MethodOpt1 { |
||||||
|
METHODOPT1_VAL1 = 1; |
||||||
|
METHODOPT1_VAL2 = 2; |
||||||
|
} |
||||||
|
|
||||||
|
extend google.protobuf.MethodOptions { |
||||||
|
optional MethodOpt1 method_opt1 = 7890860; |
||||||
|
} |
||||||
|
|
||||||
|
// A test message with custom options at all possible locations (and also some |
||||||
|
// regular options, to make sure they interact nicely). |
||||||
|
message TestMessageWithCustomOptions { |
||||||
|
option message_set_wire_format = false; |
||||||
|
|
||||||
|
option (message_opt1) = -56; |
||||||
|
|
||||||
|
optional string field1 = 1 [ctype=CORD, |
||||||
|
(field_opt1)=8765432109]; |
||||||
|
|
||||||
|
enum AnEnum { |
||||||
|
option (enum_opt1) = -789; |
||||||
|
|
||||||
|
ANENUM_VAL1 = 1; |
||||||
|
ANENUM_VAL2 = 2 [(enum_value_opt1) = 123]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// A test RPC service with custom options at all possible locations (and also |
||||||
|
// some regular options, to make sure they interact nicely). |
||||||
|
message CustomOptionFooRequest { |
||||||
|
} |
||||||
|
|
||||||
|
message CustomOptionFooResponse { |
||||||
|
} |
||||||
|
|
||||||
|
service TestServiceWithCustomOptions { |
||||||
|
option (service_opt1) = -9876543210; |
||||||
|
|
||||||
|
rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) { |
||||||
|
option (method_opt1) = METHODOPT1_VAL2; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Options of every possible field type, so we can test them all exhaustively. |
||||||
|
|
||||||
|
message DummyMessageContainingEnum { |
||||||
|
enum TestEnumType { |
||||||
|
TEST_OPTION_ENUM_TYPE1 = 22; |
||||||
|
TEST_OPTION_ENUM_TYPE2 = -23; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
message DummyMessageInvalidAsOptionType { |
||||||
|
} |
||||||
|
|
||||||
|
extend google.protobuf.MessageOptions { |
||||||
|
optional bool bool_opt = 7706090; |
||||||
|
optional int32 int32_opt = 7705709; |
||||||
|
optional int64 int64_opt = 7705542; |
||||||
|
optional uint32 uint32_opt = 7704880; |
||||||
|
optional uint64 uint64_opt = 7702367; |
||||||
|
optional sint32 sint32_opt = 7701568; |
||||||
|
optional sint64 sint64_opt = 7700863; |
||||||
|
optional fixed32 fixed32_opt = 7700307; |
||||||
|
optional fixed64 fixed64_opt = 7700194; |
||||||
|
optional sfixed32 sfixed32_opt = 7698645; |
||||||
|
optional sfixed64 sfixed64_opt = 7685475; |
||||||
|
optional float float_opt = 7675390; |
||||||
|
optional double double_opt = 7673293; |
||||||
|
optional string string_opt = 7673285; |
||||||
|
optional bytes bytes_opt = 7673238; |
||||||
|
optional DummyMessageContainingEnum.TestEnumType enum_opt = 7673233; |
||||||
|
optional DummyMessageInvalidAsOptionType message_type_opt = 7665967; |
||||||
|
} |
||||||
|
|
||||||
|
message CustomOptionMinIntegerValues { |
||||||
|
option (bool_opt) = false; |
||||||
|
option (int32_opt) = -0x80000000; |
||||||
|
option (int64_opt) = -0x8000000000000000; |
||||||
|
option (uint32_opt) = 0; |
||||||
|
option (uint64_opt) = 0; |
||||||
|
option (sint32_opt) = -0x80000000; |
||||||
|
option (sint64_opt) = -0x8000000000000000; |
||||||
|
option (fixed32_opt) = 0; |
||||||
|
option (fixed64_opt) = 0; |
||||||
|
option (sfixed32_opt) = -0x80000000; |
||||||
|
option (sfixed64_opt) = -0x8000000000000000; |
||||||
|
} |
||||||
|
|
||||||
|
message CustomOptionMaxIntegerValues { |
||||||
|
option (bool_opt) = true; |
||||||
|
option (int32_opt) = 0x7FFFFFFF; |
||||||
|
option (int64_opt) = 0x7FFFFFFFFFFFFFFF; |
||||||
|
option (uint32_opt) = 0xFFFFFFFF; |
||||||
|
option (uint64_opt) = 0xFFFFFFFFFFFFFFFF; |
||||||
|
option (sint32_opt) = 0x7FFFFFFF; |
||||||
|
option (sint64_opt) = 0x7FFFFFFFFFFFFFFF; |
||||||
|
option (fixed32_opt) = 0xFFFFFFFF; |
||||||
|
option (fixed64_opt) = 0xFFFFFFFFFFFFFFFF; |
||||||
|
option (sfixed32_opt) = 0x7FFFFFFF; |
||||||
|
option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF; |
||||||
|
} |
||||||
|
|
||||||
|
message CustomOptionOtherValues { |
||||||
|
option (int32_opt) = -100; // To test sign-extension. |
||||||
|
option (float_opt) = 12.3456789; |
||||||
|
option (double_opt) = 1.234567890123456789; |
||||||
|
option (string_opt) = "Hello, \"World\""; |
||||||
|
option (bytes_opt) = "Hello\0World"; |
||||||
|
option (enum_opt) = TEST_OPTION_ENUM_TYPE2; |
||||||
|
} |
||||||
|
|
||||||
|
message SettingRealsFromPositiveInts { |
||||||
|
option (float_opt) = 12; |
||||||
|
option (double_opt) = 154; |
||||||
|
} |
||||||
|
|
||||||
|
message SettingRealsFromNegativeInts { |
||||||
|
option (float_opt) = -12; |
||||||
|
option (double_opt) = -154; |
||||||
|
} |
||||||
|
|
||||||
|
// Options of complex message types, themselves combined and extended in |
||||||
|
// various ways. |
||||||
|
|
||||||
|
message ComplexOptionType1 { |
||||||
|
optional int32 foo = 1; |
||||||
|
optional int32 foo2 = 2; |
||||||
|
optional int32 foo3 = 3; |
||||||
|
|
||||||
|
extensions 100 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message ComplexOptionType2 { |
||||||
|
optional ComplexOptionType1 bar = 1; |
||||||
|
optional int32 baz = 2; |
||||||
|
|
||||||
|
message ComplexOptionType4 { |
||||||
|
optional int32 waldo = 1; |
||||||
|
|
||||||
|
extend google.protobuf.MessageOptions { |
||||||
|
optional ComplexOptionType4 complex_opt4 = 7633546; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
optional ComplexOptionType4 fred = 3; |
||||||
|
|
||||||
|
extensions 100 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message ComplexOptionType3 { |
||||||
|
optional int32 qux = 1; |
||||||
|
|
||||||
|
optional group ComplexOptionType5 = 2 { |
||||||
|
optional int32 plugh = 3; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
extend ComplexOptionType1 { |
||||||
|
optional int32 quux = 7663707; |
||||||
|
optional ComplexOptionType3 corge = 7663442; |
||||||
|
} |
||||||
|
|
||||||
|
extend ComplexOptionType2 { |
||||||
|
optional int32 grault = 7650927; |
||||||
|
optional ComplexOptionType1 garply = 7649992; |
||||||
|
} |
||||||
|
|
||||||
|
extend google.protobuf.MessageOptions { |
||||||
|
optional protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756; |
||||||
|
optional ComplexOptionType2 complex_opt2 = 7636949; |
||||||
|
optional ComplexOptionType3 complex_opt3 = 7636463; |
||||||
|
optional group ComplexOpt6 = 7595468 { |
||||||
|
optional int32 xyzzy = 7593951; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Note that we try various different ways of naming the same extension. |
||||||
|
message VariousComplexOptions { |
||||||
|
option (.protobuf_unittest.complex_opt1).foo = 42; |
||||||
|
option (protobuf_unittest.complex_opt1).(.protobuf_unittest.quux) = 324; |
||||||
|
option (.protobuf_unittest.complex_opt1).(protobuf_unittest.corge).qux = 876; |
||||||
|
option (complex_opt2).baz = 987; |
||||||
|
option (complex_opt2).(grault) = 654; |
||||||
|
option (complex_opt2).bar.foo = 743; |
||||||
|
option (complex_opt2).bar.(quux) = 1999; |
||||||
|
option (complex_opt2).bar.(protobuf_unittest.corge).qux = 2008; |
||||||
|
option (complex_opt2).(garply).foo = 741; |
||||||
|
option (complex_opt2).(garply).(.protobuf_unittest.quux) = 1998; |
||||||
|
option (complex_opt2).(protobuf_unittest.garply).(corge).qux = 2121; |
||||||
|
option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971; |
||||||
|
option (complex_opt2).fred.waldo = 321; |
||||||
|
option (protobuf_unittest.complex_opt3).qux = 9; |
||||||
|
option (complex_opt3).complexoptiontype5.plugh = 22; |
||||||
|
option (complexopt6).xyzzy = 24; |
||||||
|
} |
||||||
|
|
||||||
|
// ------------------------------------------------------ |
||||||
|
// Definitions for testing aggregate option parsing. |
||||||
|
// See descriptor_unittest.cc. |
||||||
|
|
||||||
|
message AggregateMessageSet { |
||||||
|
option message_set_wire_format = true; |
||||||
|
extensions 4 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message AggregateMessageSetElement { |
||||||
|
extend AggregateMessageSet { |
||||||
|
optional AggregateMessageSetElement message_set_extension = 15447542; |
||||||
|
} |
||||||
|
optional string s = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// A helper type used to test aggregate option parsing |
||||||
|
message Aggregate { |
||||||
|
optional int32 i = 1; |
||||||
|
optional string s = 2; |
||||||
|
|
||||||
|
// A nested object |
||||||
|
optional Aggregate sub = 3; |
||||||
|
|
||||||
|
// To test the parsing of extensions inside aggregate values |
||||||
|
optional google.protobuf.FileOptions file = 4; |
||||||
|
extend google.protobuf.FileOptions { |
||||||
|
optional Aggregate nested = 15476903; |
||||||
|
} |
||||||
|
|
||||||
|
// An embedded message set |
||||||
|
optional AggregateMessageSet mset = 5; |
||||||
|
} |
||||||
|
|
||||||
|
// Allow Aggregate to be used as an option at all possible locations |
||||||
|
// in the .proto grammer. |
||||||
|
extend google.protobuf.FileOptions { optional Aggregate fileopt = 15478479; } |
||||||
|
extend google.protobuf.MessageOptions { optional Aggregate msgopt = 15480088; } |
||||||
|
extend google.protobuf.FieldOptions { optional Aggregate fieldopt = 15481374; } |
||||||
|
extend google.protobuf.EnumOptions { optional Aggregate enumopt_renamed = 15483218; } |
||||||
|
extend google.protobuf.EnumValueOptions { optional Aggregate enumvalopt = 15486921; } |
||||||
|
extend google.protobuf.ServiceOptions { optional Aggregate serviceopt = 15497145; } |
||||||
|
extend google.protobuf.MethodOptions { optional Aggregate methodopt = 15512713; } |
||||||
|
|
||||||
|
// Try using AggregateOption at different points in the proto grammar |
||||||
|
option (fileopt) = { |
||||||
|
s: 'FileAnnotation' |
||||||
|
// Also test the handling of comments |
||||||
|
/* of both types */ i: 100 |
||||||
|
|
||||||
|
sub { s: 'NestedFileAnnotation' } |
||||||
|
|
||||||
|
// Include a google.protobuf.FileOptions and recursively extend it with |
||||||
|
// another fileopt. |
||||||
|
file { |
||||||
|
[protobuf_unittest.fileopt] { |
||||||
|
s:'FileExtensionAnnotation' |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// A message set inside an option value |
||||||
|
mset { |
||||||
|
[protobuf_unittest.AggregateMessageSetElement.message_set_extension] { |
||||||
|
s: 'EmbeddedMessageSetElement' |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
message AggregateMessage { |
||||||
|
option (msgopt) = { i:101 s:'MessageAnnotation' }; |
||||||
|
optional int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }]; |
||||||
|
} |
||||||
|
|
||||||
|
service AggregateService { |
||||||
|
option (serviceopt) = { s:'ServiceAnnotation' }; |
||||||
|
rpc Method (AggregateMessage) returns (AggregateMessage) { |
||||||
|
option (methodopt) = { s:'MethodAnnotation' }; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
enum AggregateEnum { |
||||||
|
option (enumopt_renamed) = { s:'EnumAnnotation' }; |
||||||
|
VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }]; |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestEmbedOptimizeForProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// Based on original Protocol Buffers design by |
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others. |
||||||
|
// |
||||||
|
// A proto file which imports a proto file that uses optimize_for = CODE_SIZE. |
||||||
|
|
||||||
|
import "google/protobuf/unittest_optimize_for.proto"; |
||||||
|
|
||||||
|
package protobuf_unittest; |
||||||
|
|
||||||
|
// We optimize for speed here, but we are importing a proto that is optimized |
||||||
|
// for code size. |
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
message TestEmbedOptimizedForSize { |
||||||
|
// Test that embedding a message which has optimize_for = CODE_SIZE into |
||||||
|
// one optimized for speed works. |
||||||
|
optional TestOptimizedForSize optional_message = 1; |
||||||
|
repeated TestOptimizedForSize repeated_message = 2; |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestEmptyProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// Based on original Protocol Buffers design by |
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others. |
||||||
|
// |
||||||
|
// This file intentionally left blank. (At one point this wouldn't compile |
||||||
|
// correctly.) |
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,67 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestImportProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// Based on original Protocol Buffers design by |
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others. |
||||||
|
// |
||||||
|
// A proto file which is imported by unittest.proto to test importing. |
||||||
|
|
||||||
|
|
||||||
|
// We don't put this in a package within proto2 because we need to make sure |
||||||
|
// that the generated code doesn't depend on being in the proto2 namespace. |
||||||
|
// In test_util.h we do |
||||||
|
// "using namespace unittest_import = protobuf_unittest_import". |
||||||
|
package protobuf_unittest_import; |
||||||
|
|
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
// Excercise the java_package option. |
||||||
|
option java_package = "com.google.protobuf.test"; |
||||||
|
|
||||||
|
// Do not set a java_outer_classname here to verify that Proto2 works without |
||||||
|
// one. |
||||||
|
|
||||||
|
message ImportMessage { |
||||||
|
optional int32 d = 1; |
||||||
|
} |
||||||
|
|
||||||
|
enum ImportEnum { |
||||||
|
IMPORT_FOO = 7; |
||||||
|
IMPORT_BAR = 8; |
||||||
|
IMPORT_BAZ = 9; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,55 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestImportLiteProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// |
||||||
|
// This is like unittest_import.proto but with optimize_for = LITE_RUNTIME. |
||||||
|
|
||||||
|
package protobuf_unittest_import; |
||||||
|
|
||||||
|
option optimize_for = LITE_RUNTIME; |
||||||
|
|
||||||
|
option java_package = "com.google.protobuf"; |
||||||
|
|
||||||
|
message ImportMessageLite { |
||||||
|
optional int32 d = 1; |
||||||
|
} |
||||||
|
|
||||||
|
enum ImportEnumLite { |
||||||
|
IMPORT_LITE_FOO = 7; |
||||||
|
IMPORT_LITE_BAR = 8; |
||||||
|
IMPORT_LITE_BAZ = 9; |
||||||
|
} |
@ -0,0 +1,318 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestLiteProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// |
||||||
|
// This is like unittest.proto but with optimize_for = LITE_RUNTIME. |
||||||
|
|
||||||
|
package protobuf_unittest; |
||||||
|
|
||||||
|
import "google/protobuf/unittest_import_lite.proto"; |
||||||
|
|
||||||
|
option optimize_for = LITE_RUNTIME; |
||||||
|
|
||||||
|
option java_package = "com.google.protobuf"; |
||||||
|
|
||||||
|
// Same as TestAllTypes but with the lite runtime. |
||||||
|
message TestAllTypesLite { |
||||||
|
message NestedMessage { |
||||||
|
optional int32 bb = 1; |
||||||
|
} |
||||||
|
|
||||||
|
enum NestedEnum { |
||||||
|
FOO = 1; |
||||||
|
BAR = 2; |
||||||
|
BAZ = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Singular |
||||||
|
optional int32 optional_int32 = 1; |
||||||
|
optional int64 optional_int64 = 2; |
||||||
|
optional uint32 optional_uint32 = 3; |
||||||
|
optional uint64 optional_uint64 = 4; |
||||||
|
optional sint32 optional_sint32 = 5; |
||||||
|
optional sint64 optional_sint64 = 6; |
||||||
|
optional fixed32 optional_fixed32 = 7; |
||||||
|
optional fixed64 optional_fixed64 = 8; |
||||||
|
optional sfixed32 optional_sfixed32 = 9; |
||||||
|
optional sfixed64 optional_sfixed64 = 10; |
||||||
|
optional float optional_float = 11; |
||||||
|
optional double optional_double = 12; |
||||||
|
optional bool optional_bool = 13; |
||||||
|
optional string optional_string = 14; |
||||||
|
optional bytes optional_bytes = 15; |
||||||
|
|
||||||
|
optional group OptionalGroup = 16 { |
||||||
|
optional int32 a = 17; |
||||||
|
} |
||||||
|
|
||||||
|
optional NestedMessage optional_nested_message = 18; |
||||||
|
optional ForeignMessageLite optional_foreign_message = 19; |
||||||
|
optional protobuf_unittest_import.ImportMessageLite |
||||||
|
optional_import_message = 20; |
||||||
|
|
||||||
|
optional NestedEnum optional_nested_enum = 21; |
||||||
|
optional ForeignEnumLite optional_foreign_enum = 22; |
||||||
|
optional protobuf_unittest_import.ImportEnumLite optional_import_enum = 23; |
||||||
|
|
||||||
|
optional string optional_string_piece = 24 [ctype=STRING_PIECE]; |
||||||
|
optional string optional_cord = 25 [ctype=CORD]; |
||||||
|
|
||||||
|
// Repeated |
||||||
|
repeated int32 repeated_int32 = 31; |
||||||
|
repeated int64 repeated_int64 = 32; |
||||||
|
repeated uint32 repeated_uint32 = 33; |
||||||
|
repeated uint64 repeated_uint64 = 34; |
||||||
|
repeated sint32 repeated_sint32 = 35; |
||||||
|
repeated sint64 repeated_sint64 = 36; |
||||||
|
repeated fixed32 repeated_fixed32 = 37; |
||||||
|
repeated fixed64 repeated_fixed64 = 38; |
||||||
|
repeated sfixed32 repeated_sfixed32 = 39; |
||||||
|
repeated sfixed64 repeated_sfixed64 = 40; |
||||||
|
repeated float repeated_float = 41; |
||||||
|
repeated double repeated_double = 42; |
||||||
|
repeated bool repeated_bool = 43; |
||||||
|
repeated string repeated_string = 44; |
||||||
|
repeated bytes repeated_bytes = 45; |
||||||
|
|
||||||
|
repeated group RepeatedGroup = 46 { |
||||||
|
optional int32 a = 47; |
||||||
|
} |
||||||
|
|
||||||
|
repeated NestedMessage repeated_nested_message = 48; |
||||||
|
repeated ForeignMessageLite repeated_foreign_message = 49; |
||||||
|
repeated protobuf_unittest_import.ImportMessageLite |
||||||
|
repeated_import_message = 50; |
||||||
|
|
||||||
|
repeated NestedEnum repeated_nested_enum = 51; |
||||||
|
repeated ForeignEnumLite repeated_foreign_enum = 52; |
||||||
|
repeated protobuf_unittest_import.ImportEnumLite repeated_import_enum = 53; |
||||||
|
|
||||||
|
repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; |
||||||
|
repeated string repeated_cord = 55 [ctype=CORD]; |
||||||
|
|
||||||
|
// Singular with defaults |
||||||
|
optional int32 default_int32 = 61 [default = 41 ]; |
||||||
|
optional int64 default_int64 = 62 [default = 42 ]; |
||||||
|
optional uint32 default_uint32 = 63 [default = 43 ]; |
||||||
|
optional uint64 default_uint64 = 64 [default = 44 ]; |
||||||
|
optional sint32 default_sint32 = 65 [default = -45 ]; |
||||||
|
optional sint64 default_sint64 = 66 [default = 46 ]; |
||||||
|
optional fixed32 default_fixed32 = 67 [default = 47 ]; |
||||||
|
optional fixed64 default_fixed64 = 68 [default = 48 ]; |
||||||
|
optional sfixed32 default_sfixed32 = 69 [default = 49 ]; |
||||||
|
optional sfixed64 default_sfixed64 = 70 [default = -50 ]; |
||||||
|
optional float default_float = 71 [default = 51.5 ]; |
||||||
|
optional double default_double = 72 [default = 52e3 ]; |
||||||
|
optional bool default_bool = 73 [default = true ]; |
||||||
|
optional string default_string = 74 [default = "hello"]; |
||||||
|
optional bytes default_bytes = 75 [default = "world"]; |
||||||
|
|
||||||
|
optional NestedEnum default_nested_enum = 81 [default = BAR]; |
||||||
|
optional ForeignEnumLite default_foreign_enum = 82 |
||||||
|
[default = FOREIGN_LITE_BAR]; |
||||||
|
optional protobuf_unittest_import.ImportEnumLite |
||||||
|
default_import_enum = 83 [default = IMPORT_LITE_BAR]; |
||||||
|
|
||||||
|
optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; |
||||||
|
optional string default_cord = 85 [ctype=CORD,default="123"]; |
||||||
|
} |
||||||
|
|
||||||
|
message ForeignMessageLite { |
||||||
|
optional int32 c = 1; |
||||||
|
} |
||||||
|
|
||||||
|
enum ForeignEnumLite { |
||||||
|
FOREIGN_LITE_FOO = 4; |
||||||
|
FOREIGN_LITE_BAR = 5; |
||||||
|
FOREIGN_LITE_BAZ = 6; |
||||||
|
} |
||||||
|
|
||||||
|
message TestPackedTypesLite { |
||||||
|
repeated int32 packed_int32 = 90 [packed = true]; |
||||||
|
repeated int64 packed_int64 = 91 [packed = true]; |
||||||
|
repeated uint32 packed_uint32 = 92 [packed = true]; |
||||||
|
repeated uint64 packed_uint64 = 93 [packed = true]; |
||||||
|
repeated sint32 packed_sint32 = 94 [packed = true]; |
||||||
|
repeated sint64 packed_sint64 = 95 [packed = true]; |
||||||
|
repeated fixed32 packed_fixed32 = 96 [packed = true]; |
||||||
|
repeated fixed64 packed_fixed64 = 97 [packed = true]; |
||||||
|
repeated sfixed32 packed_sfixed32 = 98 [packed = true]; |
||||||
|
repeated sfixed64 packed_sfixed64 = 99 [packed = true]; |
||||||
|
repeated float packed_float = 100 [packed = true]; |
||||||
|
repeated double packed_double = 101 [packed = true]; |
||||||
|
repeated bool packed_bool = 102 [packed = true]; |
||||||
|
repeated ForeignEnumLite packed_enum = 103 [packed = true]; |
||||||
|
} |
||||||
|
|
||||||
|
message TestAllExtensionsLite { |
||||||
|
extensions 1 to max; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestAllExtensionsLite { |
||||||
|
// Singular |
||||||
|
optional int32 optional_int32_extension_lite = 1; |
||||||
|
optional int64 optional_int64_extension_lite = 2; |
||||||
|
optional uint32 optional_uint32_extension_lite = 3; |
||||||
|
optional uint64 optional_uint64_extension_lite = 4; |
||||||
|
optional sint32 optional_sint32_extension_lite = 5; |
||||||
|
optional sint64 optional_sint64_extension_lite = 6; |
||||||
|
optional fixed32 optional_fixed32_extension_lite = 7; |
||||||
|
optional fixed64 optional_fixed64_extension_lite = 8; |
||||||
|
optional sfixed32 optional_sfixed32_extension_lite = 9; |
||||||
|
optional sfixed64 optional_sfixed64_extension_lite = 10; |
||||||
|
optional float optional_float_extension_lite = 11; |
||||||
|
optional double optional_double_extension_lite = 12; |
||||||
|
optional bool optional_bool_extension_lite = 13; |
||||||
|
optional string optional_string_extension_lite = 14; |
||||||
|
optional bytes optional_bytes_extension_lite = 15; |
||||||
|
|
||||||
|
optional group OptionalGroup_extension_lite = 16 { |
||||||
|
optional int32 a = 17; |
||||||
|
} |
||||||
|
|
||||||
|
optional TestAllTypesLite.NestedMessage optional_nested_message_extension_lite |
||||||
|
= 18; |
||||||
|
optional ForeignMessageLite optional_foreign_message_extension_lite = 19; |
||||||
|
optional protobuf_unittest_import.ImportMessageLite |
||||||
|
optional_import_message_extension_lite = 20; |
||||||
|
|
||||||
|
optional TestAllTypesLite.NestedEnum optional_nested_enum_extension_lite = 21; |
||||||
|
optional ForeignEnumLite optional_foreign_enum_extension_lite = 22; |
||||||
|
optional protobuf_unittest_import.ImportEnumLite |
||||||
|
optional_import_enum_extension_lite = 23; |
||||||
|
|
||||||
|
optional string optional_string_piece_extension_lite = 24 |
||||||
|
[ctype=STRING_PIECE]; |
||||||
|
optional string optional_cord_extension_lite = 25 [ctype=CORD]; |
||||||
|
|
||||||
|
// Repeated |
||||||
|
repeated int32 repeated_int32_extension_lite = 31; |
||||||
|
repeated int64 repeated_int64_extension_lite = 32; |
||||||
|
repeated uint32 repeated_uint32_extension_lite = 33; |
||||||
|
repeated uint64 repeated_uint64_extension_lite = 34; |
||||||
|
repeated sint32 repeated_sint32_extension_lite = 35; |
||||||
|
repeated sint64 repeated_sint64_extension_lite = 36; |
||||||
|
repeated fixed32 repeated_fixed32_extension_lite = 37; |
||||||
|
repeated fixed64 repeated_fixed64_extension_lite = 38; |
||||||
|
repeated sfixed32 repeated_sfixed32_extension_lite = 39; |
||||||
|
repeated sfixed64 repeated_sfixed64_extension_lite = 40; |
||||||
|
repeated float repeated_float_extension_lite = 41; |
||||||
|
repeated double repeated_double_extension_lite = 42; |
||||||
|
repeated bool repeated_bool_extension_lite = 43; |
||||||
|
repeated string repeated_string_extension_lite = 44; |
||||||
|
repeated bytes repeated_bytes_extension_lite = 45; |
||||||
|
|
||||||
|
repeated group RepeatedGroup_extension_lite = 46 { |
||||||
|
optional int32 a = 47; |
||||||
|
} |
||||||
|
|
||||||
|
repeated TestAllTypesLite.NestedMessage repeated_nested_message_extension_lite |
||||||
|
= 48; |
||||||
|
repeated ForeignMessageLite repeated_foreign_message_extension_lite = 49; |
||||||
|
repeated protobuf_unittest_import.ImportMessageLite |
||||||
|
repeated_import_message_extension_lite = 50; |
||||||
|
|
||||||
|
repeated TestAllTypesLite.NestedEnum repeated_nested_enum_extension_lite = 51; |
||||||
|
repeated ForeignEnumLite repeated_foreign_enum_extension_lite = 52; |
||||||
|
repeated protobuf_unittest_import.ImportEnumLite |
||||||
|
repeated_import_enum_extension_lite = 53; |
||||||
|
|
||||||
|
repeated string repeated_string_piece_extension_lite = 54 |
||||||
|
[ctype=STRING_PIECE]; |
||||||
|
repeated string repeated_cord_extension_lite = 55 [ctype=CORD]; |
||||||
|
|
||||||
|
// Singular with defaults |
||||||
|
optional int32 default_int32_extension_lite = 61 [default = 41 ]; |
||||||
|
optional int64 default_int64_extension_lite = 62 [default = 42 ]; |
||||||
|
optional uint32 default_uint32_extension_lite = 63 [default = 43 ]; |
||||||
|
optional uint64 default_uint64_extension_lite = 64 [default = 44 ]; |
||||||
|
optional sint32 default_sint32_extension_lite = 65 [default = -45 ]; |
||||||
|
optional sint64 default_sint64_extension_lite = 66 [default = 46 ]; |
||||||
|
optional fixed32 default_fixed32_extension_lite = 67 [default = 47 ]; |
||||||
|
optional fixed64 default_fixed64_extension_lite = 68 [default = 48 ]; |
||||||
|
optional sfixed32 default_sfixed32_extension_lite = 69 [default = 49 ]; |
||||||
|
optional sfixed64 default_sfixed64_extension_lite = 70 [default = -50 ]; |
||||||
|
optional float default_float_extension_lite = 71 [default = 51.5 ]; |
||||||
|
optional double default_double_extension_lite = 72 [default = 52e3 ]; |
||||||
|
optional bool default_bool_extension_lite = 73 [default = true ]; |
||||||
|
optional string default_string_extension_lite = 74 [default = "hello"]; |
||||||
|
optional bytes default_bytes_extension_lite = 75 [default = "world"]; |
||||||
|
|
||||||
|
optional TestAllTypesLite.NestedEnum |
||||||
|
default_nested_enum_extension_lite = 81 [default = BAR]; |
||||||
|
optional ForeignEnumLite |
||||||
|
default_foreign_enum_extension_lite = 82 [default = FOREIGN_LITE_BAR]; |
||||||
|
optional protobuf_unittest_import.ImportEnumLite |
||||||
|
default_import_enum_extension_lite = 83 [default = IMPORT_LITE_BAR]; |
||||||
|
|
||||||
|
optional string default_string_piece_extension_lite = 84 [ctype=STRING_PIECE, |
||||||
|
default="abc"]; |
||||||
|
optional string default_cord_extension_lite = 85 [ctype=CORD, default="123"]; |
||||||
|
} |
||||||
|
|
||||||
|
message TestPackedExtensionsLite { |
||||||
|
extensions 1 to max; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestPackedExtensionsLite { |
||||||
|
repeated int32 packed_int32_extension_lite = 90 [packed = true]; |
||||||
|
repeated int64 packed_int64_extension_lite = 91 [packed = true]; |
||||||
|
repeated uint32 packed_uint32_extension_lite = 92 [packed = true]; |
||||||
|
repeated uint64 packed_uint64_extension_lite = 93 [packed = true]; |
||||||
|
repeated sint32 packed_sint32_extension_lite = 94 [packed = true]; |
||||||
|
repeated sint64 packed_sint64_extension_lite = 95 [packed = true]; |
||||||
|
repeated fixed32 packed_fixed32_extension_lite = 96 [packed = true]; |
||||||
|
repeated fixed64 packed_fixed64_extension_lite = 97 [packed = true]; |
||||||
|
repeated sfixed32 packed_sfixed32_extension_lite = 98 [packed = true]; |
||||||
|
repeated sfixed64 packed_sfixed64_extension_lite = 99 [packed = true]; |
||||||
|
repeated float packed_float_extension_lite = 100 [packed = true]; |
||||||
|
repeated double packed_double_extension_lite = 101 [packed = true]; |
||||||
|
repeated bool packed_bool_extension_lite = 102 [packed = true]; |
||||||
|
repeated ForeignEnumLite packed_enum_extension_lite = 103 [packed = true]; |
||||||
|
} |
||||||
|
|
||||||
|
message TestNestedExtensionLite { |
||||||
|
extend TestAllExtensionsLite { |
||||||
|
optional int32 nested_extension = 12345; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Test that deprecated fields work. We only verify that they compile (at one |
||||||
|
// point this failed). |
||||||
|
message TestDeprecatedLite { |
||||||
|
optional int32 deprecated_field = 1 [deprecated = true]; |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestLiteImportNonLiteProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// |
||||||
|
// Tests that a "lite" message can import a regular message. |
||||||
|
|
||||||
|
package protobuf_unittest; |
||||||
|
|
||||||
|
import "google/protobuf/unittest.proto"; |
||||||
|
|
||||||
|
option optimize_for = LITE_RUNTIME; |
||||||
|
|
||||||
|
message TestLiteImportsNonlite { |
||||||
|
optional TestAllTypes message = 1; |
||||||
|
} |
@ -0,0 +1,78 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestMessageSetProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// Based on original Protocol Buffers design by |
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others. |
||||||
|
// |
||||||
|
// This file contains messages for testing message_set_wire_format. |
||||||
|
|
||||||
|
package protobuf_unittest; |
||||||
|
|
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
// A message with message_set_wire_format. |
||||||
|
message TestMessageSet { |
||||||
|
option message_set_wire_format = true; |
||||||
|
extensions 4 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message TestMessageSetContainer { |
||||||
|
optional TestMessageSet message_set = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message TestMessageSetExtension1 { |
||||||
|
extend TestMessageSet { |
||||||
|
optional TestMessageSetExtension1 message_set_extension = 1545008; |
||||||
|
} |
||||||
|
optional int32 i = 15; |
||||||
|
} |
||||||
|
|
||||||
|
message TestMessageSetExtension2 { |
||||||
|
extend TestMessageSet { |
||||||
|
optional TestMessageSetExtension2 message_set_extension = 1547769; |
||||||
|
} |
||||||
|
optional string str = 25; |
||||||
|
} |
||||||
|
|
||||||
|
// MessageSet wire format is equivalent to this. |
||||||
|
message RawMessageSet { |
||||||
|
repeated group Item = 1 { |
||||||
|
required int32 type_id = 2; |
||||||
|
required bytes message = 3; |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,58 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos.NoGenericService"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestNoGenericServicesProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
|
||||||
|
package google.protobuf.no_generic_services_test; |
||||||
|
|
||||||
|
// *_generic_services are false by default. |
||||||
|
|
||||||
|
message TestMessage { |
||||||
|
optional int32 a = 1; |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
enum TestEnum { |
||||||
|
FOO = 1; |
||||||
|
} |
||||||
|
|
||||||
|
extend TestMessage { |
||||||
|
optional int32 test_extension = 1000; |
||||||
|
} |
||||||
|
|
||||||
|
service TestService { |
||||||
|
rpc Foo(TestMessage) returns(TestMessage); |
||||||
|
} |
@ -0,0 +1,67 @@ |
|||||||
|
// Additional options required for C# generation. File from copyright |
||||||
|
// line onwards is as per original distribution. |
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestOptimizeForProtoFile"; |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// Based on original Protocol Buffers design by |
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others. |
||||||
|
// |
||||||
|
// A proto file which uses optimize_for = CODE_SIZE. |
||||||
|
|
||||||
|
import "google/protobuf/unittest.proto"; |
||||||
|
|
||||||
|
package protobuf_unittest; |
||||||
|
|
||||||
|
option optimize_for = CODE_SIZE; |
||||||
|
|
||||||
|
message TestOptimizedForSize { |
||||||
|
optional int32 i = 1; |
||||||
|
optional ForeignMessage msg = 19; |
||||||
|
|
||||||
|
extensions 1000 to max; |
||||||
|
|
||||||
|
extend TestOptimizedForSize { |
||||||
|
optional int32 test_extension = 1234; |
||||||
|
optional TestRequiredOptimizedForSize test_extension2 = 1235; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
message TestRequiredOptimizedForSize { |
||||||
|
required int32 x = 1; |
||||||
|
} |
||||||
|
|
||||||
|
message TestOptionalOptimizedForSize { |
||||||
|
optional TestRequiredOptimizedForSize o = 1; |
||||||
|
} |
@ -0,0 +1,140 @@ |
|||||||
|
package unittest_google_size; |
||||||
|
|
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGoogleSizeProtoFile"; |
||||||
|
|
||||||
|
option java_outer_classname = "GoogleSize"; |
||||||
|
option optimize_for = CODE_SIZE; |
||||||
|
|
||||||
|
message SizeMessage1 { |
||||||
|
required string field1 = 1; |
||||||
|
optional string field9 = 9; |
||||||
|
optional string field18 = 18; |
||||||
|
optional bool field80 = 80 [default=false]; |
||||||
|
optional bool field81 = 81 [default=true]; |
||||||
|
required int32 field2 = 2; |
||||||
|
required int32 field3 = 3; |
||||||
|
optional int32 field280 = 280; |
||||||
|
optional int32 field6 = 6 [default=0]; |
||||||
|
optional int64 field22 = 22; |
||||||
|
optional string field4 = 4; |
||||||
|
repeated fixed64 field5 = 5; |
||||||
|
optional bool field59 = 59 [default=false]; |
||||||
|
optional string field7 = 7; |
||||||
|
optional int32 field16 = 16; |
||||||
|
optional int32 field130 = 130 [default=0]; |
||||||
|
optional bool field12 = 12 [default=true]; |
||||||
|
optional bool field17 = 17 [default=true]; |
||||||
|
optional bool field13 = 13 [default=true]; |
||||||
|
optional bool field14 = 14 [default=true]; |
||||||
|
optional int32 field104 = 104 [default=0]; |
||||||
|
optional int32 field100 = 100 [default=0]; |
||||||
|
optional int32 field101 = 101 [default=0]; |
||||||
|
optional string field102 = 102; |
||||||
|
optional string field103 = 103; |
||||||
|
optional int32 field29 = 29 [default=0]; |
||||||
|
optional bool field30 = 30 [default=false]; |
||||||
|
optional int32 field60 = 60 [default=-1]; |
||||||
|
optional int32 field271 = 271 [default=-1]; |
||||||
|
optional int32 field272 = 272 [default=-1]; |
||||||
|
optional int32 field150 = 150; |
||||||
|
optional int32 field23 = 23 [default=0]; |
||||||
|
optional bool field24 = 24 [default=false]; |
||||||
|
optional int32 field25 = 25 [default=0]; |
||||||
|
optional SizeMessage1SubMessage field15 = 15; |
||||||
|
optional bool field78 = 78; |
||||||
|
optional int32 field67 = 67 [default=0]; |
||||||
|
optional int32 field68 = 68; |
||||||
|
optional int32 field128 = 128 [default=0]; |
||||||
|
optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; |
||||||
|
optional int32 field131 = 131 [default=0]; |
||||||
|
} |
||||||
|
|
||||||
|
message SizeMessage1SubMessage { |
||||||
|
optional int32 field1 = 1 [default=0]; |
||||||
|
optional int32 field2 = 2 [default=0]; |
||||||
|
optional int32 field3 = 3 [default=0]; |
||||||
|
optional string field15 = 15; |
||||||
|
optional bool field12 = 12 [default=true]; |
||||||
|
optional int64 field13 = 13; |
||||||
|
optional int64 field14 = 14; |
||||||
|
optional int32 field16 = 16; |
||||||
|
optional int32 field19 = 19 [default=2]; |
||||||
|
optional bool field20 = 20 [default=true]; |
||||||
|
optional bool field28 = 28 [default=true]; |
||||||
|
optional fixed64 field21 = 21; |
||||||
|
optional int32 field22 = 22; |
||||||
|
optional bool field23 = 23 [ default=false ]; |
||||||
|
optional bool field206 = 206 [default=false]; |
||||||
|
optional fixed32 field203 = 203; |
||||||
|
optional int32 field204 = 204; |
||||||
|
optional string field205 = 205; |
||||||
|
optional uint64 field207 = 207; |
||||||
|
optional uint64 field300 = 300; |
||||||
|
} |
||||||
|
|
||||||
|
message SizeMessage2 { |
||||||
|
optional string field1 = 1; |
||||||
|
optional int64 field3 = 3; |
||||||
|
optional int64 field4 = 4; |
||||||
|
optional int64 field30 = 30; |
||||||
|
optional bool field75 = 75 [default=false]; |
||||||
|
optional string field6 = 6; |
||||||
|
optional bytes field2 = 2; |
||||||
|
optional int32 field21 = 21 [default=0]; |
||||||
|
optional int32 field71 = 71; |
||||||
|
optional float field25 = 25; |
||||||
|
optional int32 field109 = 109 [default=0]; |
||||||
|
optional int32 field210 = 210 [default=0]; |
||||||
|
optional int32 field211 = 211 [default=0]; |
||||||
|
optional int32 field212 = 212 [default=0]; |
||||||
|
optional int32 field213 = 213 [default=0]; |
||||||
|
optional int32 field216 = 216 [default=0]; |
||||||
|
optional int32 field217 = 217 [default=0]; |
||||||
|
optional int32 field218 = 218 [default=0]; |
||||||
|
optional int32 field220 = 220 [default=0]; |
||||||
|
optional int32 field221 = 221 [default=0]; |
||||||
|
optional float field222 = 222 [default=0.0]; |
||||||
|
optional int32 field63 = 63; |
||||||
|
|
||||||
|
repeated group Group1 = 10 { |
||||||
|
required float field11 = 11; |
||||||
|
optional float field26 = 26; |
||||||
|
optional string field12 = 12; |
||||||
|
optional string field13 = 13; |
||||||
|
repeated string field14 = 14; |
||||||
|
required uint64 field15 = 15; |
||||||
|
optional int32 field5 = 5; |
||||||
|
optional string field27 = 27; |
||||||
|
optional int32 field28 = 28; |
||||||
|
optional string field29 = 29; |
||||||
|
optional string field16 = 16; |
||||||
|
repeated string field22 = 22; |
||||||
|
repeated int32 field73 = 73; |
||||||
|
optional int32 field20 = 20 [default=0]; |
||||||
|
optional string field24 = 24; |
||||||
|
optional SizeMessage2GroupedMessage field31 = 31; |
||||||
|
} |
||||||
|
repeated string field128 = 128; |
||||||
|
optional int64 field131 = 131; |
||||||
|
repeated string field127 = 127; |
||||||
|
optional int32 field129 = 129; |
||||||
|
repeated int64 field130 = 130; |
||||||
|
optional bool field205 = 205 [default=false]; |
||||||
|
optional bool field206 = 206 [default=false]; |
||||||
|
} |
||||||
|
|
||||||
|
message SizeMessage2GroupedMessage { |
||||||
|
optional float field1 = 1; |
||||||
|
optional float field2 = 2; |
||||||
|
optional float field3 = 3 [default=0.0]; |
||||||
|
optional bool field4 = 4; |
||||||
|
optional bool field5 = 5; |
||||||
|
optional bool field6 = 6 [default=true]; |
||||||
|
optional bool field7 = 7 [default=false]; |
||||||
|
optional float field8 = 8; |
||||||
|
optional bool field9 = 9; |
||||||
|
optional float field10 = 10; |
||||||
|
optional int64 field11 = 11; |
||||||
|
} |
@ -0,0 +1,140 @@ |
|||||||
|
package unittest_google_speed; |
||||||
|
|
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGoogleSpeedProtoFile"; |
||||||
|
|
||||||
|
option java_outer_classname = "GoogleSpeed"; |
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
message SpeedMessage1 { |
||||||
|
required string field1 = 1; |
||||||
|
optional string field9 = 9; |
||||||
|
optional string field18 = 18; |
||||||
|
optional bool field80 = 80 [default=false]; |
||||||
|
optional bool field81 = 81 [default=true]; |
||||||
|
required int32 field2 = 2; |
||||||
|
required int32 field3 = 3; |
||||||
|
optional int32 field280 = 280; |
||||||
|
optional int32 field6 = 6 [default=0]; |
||||||
|
optional int64 field22 = 22; |
||||||
|
optional string field4 = 4; |
||||||
|
repeated fixed64 field5 = 5; |
||||||
|
optional bool field59 = 59 [default=false]; |
||||||
|
optional string field7 = 7; |
||||||
|
optional int32 field16 = 16; |
||||||
|
optional int32 field130 = 130 [default=0]; |
||||||
|
optional bool field12 = 12 [default=true]; |
||||||
|
optional bool field17 = 17 [default=true]; |
||||||
|
optional bool field13 = 13 [default=true]; |
||||||
|
optional bool field14 = 14 [default=true]; |
||||||
|
optional int32 field104 = 104 [default=0]; |
||||||
|
optional int32 field100 = 100 [default=0]; |
||||||
|
optional int32 field101 = 101 [default=0]; |
||||||
|
optional string field102 = 102; |
||||||
|
optional string field103 = 103; |
||||||
|
optional int32 field29 = 29 [default=0]; |
||||||
|
optional bool field30 = 30 [default=false]; |
||||||
|
optional int32 field60 = 60 [default=-1]; |
||||||
|
optional int32 field271 = 271 [default=-1]; |
||||||
|
optional int32 field272 = 272 [default=-1]; |
||||||
|
optional int32 field150 = 150; |
||||||
|
optional int32 field23 = 23 [default=0]; |
||||||
|
optional bool field24 = 24 [default=false]; |
||||||
|
optional int32 field25 = 25 [default=0]; |
||||||
|
optional SpeedMessage1SubMessage field15 = 15; |
||||||
|
optional bool field78 = 78; |
||||||
|
optional int32 field67 = 67 [default=0]; |
||||||
|
optional int32 field68 = 68; |
||||||
|
optional int32 field128 = 128 [default=0]; |
||||||
|
optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; |
||||||
|
optional int32 field131 = 131 [default=0]; |
||||||
|
} |
||||||
|
|
||||||
|
message SpeedMessage1SubMessage { |
||||||
|
optional int32 field1 = 1 [default=0]; |
||||||
|
optional int32 field2 = 2 [default=0]; |
||||||
|
optional int32 field3 = 3 [default=0]; |
||||||
|
optional string field15 = 15; |
||||||
|
optional bool field12 = 12 [default=true]; |
||||||
|
optional int64 field13 = 13; |
||||||
|
optional int64 field14 = 14; |
||||||
|
optional int32 field16 = 16; |
||||||
|
optional int32 field19 = 19 [default=2]; |
||||||
|
optional bool field20 = 20 [default=true]; |
||||||
|
optional bool field28 = 28 [default=true]; |
||||||
|
optional fixed64 field21 = 21; |
||||||
|
optional int32 field22 = 22; |
||||||
|
optional bool field23 = 23 [ default=false ]; |
||||||
|
optional bool field206 = 206 [default=false]; |
||||||
|
optional fixed32 field203 = 203; |
||||||
|
optional int32 field204 = 204; |
||||||
|
optional string field205 = 205; |
||||||
|
optional uint64 field207 = 207; |
||||||
|
optional uint64 field300 = 300; |
||||||
|
} |
||||||
|
|
||||||
|
message SpeedMessage2 { |
||||||
|
optional string field1 = 1; |
||||||
|
optional int64 field3 = 3; |
||||||
|
optional int64 field4 = 4; |
||||||
|
optional int64 field30 = 30; |
||||||
|
optional bool field75 = 75 [default=false]; |
||||||
|
optional string field6 = 6; |
||||||
|
optional bytes field2 = 2; |
||||||
|
optional int32 field21 = 21 [default=0]; |
||||||
|
optional int32 field71 = 71; |
||||||
|
optional float field25 = 25; |
||||||
|
optional int32 field109 = 109 [default=0]; |
||||||
|
optional int32 field210 = 210 [default=0]; |
||||||
|
optional int32 field211 = 211 [default=0]; |
||||||
|
optional int32 field212 = 212 [default=0]; |
||||||
|
optional int32 field213 = 213 [default=0]; |
||||||
|
optional int32 field216 = 216 [default=0]; |
||||||
|
optional int32 field217 = 217 [default=0]; |
||||||
|
optional int32 field218 = 218 [default=0]; |
||||||
|
optional int32 field220 = 220 [default=0]; |
||||||
|
optional int32 field221 = 221 [default=0]; |
||||||
|
optional float field222 = 222 [default=0.0]; |
||||||
|
optional int32 field63 = 63; |
||||||
|
|
||||||
|
repeated group Group1 = 10 { |
||||||
|
required float field11 = 11; |
||||||
|
optional float field26 = 26; |
||||||
|
optional string field12 = 12; |
||||||
|
optional string field13 = 13; |
||||||
|
repeated string field14 = 14; |
||||||
|
required uint64 field15 = 15; |
||||||
|
optional int32 field5 = 5; |
||||||
|
optional string field27 = 27; |
||||||
|
optional int32 field28 = 28; |
||||||
|
optional string field29 = 29; |
||||||
|
optional string field16 = 16; |
||||||
|
repeated string field22 = 22; |
||||||
|
repeated int32 field73 = 73; |
||||||
|
optional int32 field20 = 20 [default=0]; |
||||||
|
optional string field24 = 24; |
||||||
|
optional SpeedMessage2GroupedMessage field31 = 31; |
||||||
|
} |
||||||
|
repeated string field128 = 128; |
||||||
|
optional int64 field131 = 131; |
||||||
|
repeated string field127 = 127; |
||||||
|
optional int32 field129 = 129; |
||||||
|
repeated int64 field130 = 130; |
||||||
|
optional bool field205 = 205 [default=false]; |
||||||
|
optional bool field206 = 206 [default=false]; |
||||||
|
} |
||||||
|
|
||||||
|
message SpeedMessage2GroupedMessage { |
||||||
|
optional float field1 = 1; |
||||||
|
optional float field2 = 2; |
||||||
|
optional float field3 = 3 [default=0.0]; |
||||||
|
optional bool field4 = 4; |
||||||
|
optional bool field5 = 5; |
||||||
|
optional bool field6 = 6 [default=true]; |
||||||
|
optional bool field7 = 7 [default=false]; |
||||||
|
optional float field8 = 8; |
||||||
|
optional bool field9 = 9; |
||||||
|
optional float field10 = 10; |
||||||
|
optional int64 field11 = 11; |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
<NotepadPlus> |
||||||
|
<!-- |
||||||
|
Defines syntax highlighting for Notepad++. |
||||||
|
1. Install Notepad++ from http://notepad-plus-plus.org |
||||||
|
2. Open Notepad++, from the View menu, select "User-Defined Dialog..." |
||||||
|
3. Click the "Import..." button and select this file |
||||||
|
4. Restart Notepad++ |
||||||
|
5. Open and edit any *.proto file |
||||||
|
--> |
||||||
|
<UserLang name="Proto Buffer" ext="proto"> |
||||||
|
<Settings> |
||||||
|
<Global caseIgnored="no" /> |
||||||
|
<TreatAsSymbol comment="no" commentLine="yes" /> |
||||||
|
<Prefix words1="no" words2="no" words3="no" words4="yes" /> |
||||||
|
</Settings> |
||||||
|
<KeywordLists> |
||||||
|
<Keywords name="Delimiters">[00]00</Keywords> |
||||||
|
<Keywords name="Folder+">{</Keywords> |
||||||
|
<Keywords name="Folder-">}</Keywords> |
||||||
|
<Keywords name="Operators">=</Keywords> |
||||||
|
<Keywords name="Comment"> 1option 1package 1import 2; 0//</Keywords> |
||||||
|
<Keywords name="Words1">message enum service extend</Keywords> |
||||||
|
<Keywords name="Words2">required optional repeated extensions to rpc returns</Keywords> |
||||||
|
<Keywords name="Words3">double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes</Keywords> |
||||||
|
<Keywords name="Words4"></Keywords> |
||||||
|
</KeywordLists> |
||||||
|
<Styles> |
||||||
|
<WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="FOLDEROPEN" styleID="12" fgColor="000000" bgColor="FFFFFF" fontStyle="1" /> |
||||||
|
<WordsStyle name="FOLDERCLOSE" styleID="13" fgColor="000000" bgColor="FFFFFF" fontStyle="1" /> |
||||||
|
<WordsStyle name="KEYWORD1" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="KEYWORD2" styleID="6" fgColor="0080C0" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="KEYWORD3" styleID="7" fgColor="0000FF" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="KEYWORD4" styleID="8" fgColor="008040" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="COMMENT LINE" styleID="2" fgColor="949494" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="NUMBER" styleID="4" fgColor="FF0000" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="OPERATOR" styleID="10" fgColor="000000" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="DELIMINER1" styleID="14" fgColor="800080" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="DELIMINER2" styleID="15" fgColor="808080" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
<WordsStyle name="DELIMINER3" styleID="16" fgColor="000000" bgColor="FFFFFF" fontStyle="0" /> |
||||||
|
</Styles> |
||||||
|
</UserLang> |
||||||
|
</NotepadPlus> |
@ -0,0 +1,31 @@ |
|||||||
|
package tutorial; |
||||||
|
|
||||||
|
import "google/protobuf/csharp_options.proto"; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.Examples.AddressBook"; |
||||||
|
option (google.protobuf.csharp_file_options).umbrella_classname = "AddressBookProtos"; |
||||||
|
|
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
message Person { |
||||||
|
required string name = 1; |
||||||
|
required int32 id = 2; // Unique ID number for this person. |
||||||
|
optional string email = 3; |
||||||
|
|
||||||
|
enum PhoneType { |
||||||
|
MOBILE = 0; |
||||||
|
HOME = 1; |
||||||
|
WORK = 2; |
||||||
|
} |
||||||
|
|
||||||
|
message PhoneNumber { |
||||||
|
required string number = 1; |
||||||
|
optional PhoneType type = 2 [default = HOME]; |
||||||
|
} |
||||||
|
|
||||||
|
repeated PhoneNumber phone = 4; |
||||||
|
} |
||||||
|
|
||||||
|
// Our address book file is just one of these. |
||||||
|
message AddressBook { |
||||||
|
repeated Person person = 1; |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,29 @@ |
|||||||
|
using System.Reflection; |
||||||
|
using System.Runtime.InteropServices; |
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following |
||||||
|
// set of attributes. Change these attribute values to modify the information |
||||||
|
// associated with an assembly. |
||||||
|
|
||||||
|
[assembly: AssemblyTitle("AddressBook")] |
||||||
|
[assembly: AssemblyDescription("")] |
||||||
|
[assembly: AssemblyConfiguration("")] |
||||||
|
[assembly: AssemblyCompany("")] |
||||||
|
[assembly: AssemblyProduct("AddressBook")] |
||||||
|
[assembly: AssemblyCopyright("Copyright © 2008")] |
||||||
|
[assembly: AssemblyTrademark("")] |
||||||
|
[assembly: AssemblyCulture("")] |
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values: |
||||||
|
// |
||||||
|
// Major Version |
||||||
|
// Minor Version |
||||||
|
// Build Number |
||||||
|
// Revision |
||||||
|
// |
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers |
||||||
|
// by using the '*' as shown below: |
||||||
|
// [assembly: AssemblyVersion("2.4.1.555")] |
||||||
|
|
||||||
|
[assembly: AssemblyVersion("2.4.1.555")] |
||||||
|
[assembly: AssemblyFileVersion("2.4.1.555")] |
@ -0,0 +1,3 @@ |
|||||||
|
<?xml version="1.0"?> |
||||||
|
<configuration> |
||||||
|
<startup/></configuration> |
@ -0,0 +1,32 @@ |
|||||||
|
using System; |
||||||
|
using System.Reflection; |
||||||
|
using System.Runtime.CompilerServices; |
||||||
|
using System.Runtime.InteropServices; |
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following |
||||||
|
// set of attributes. Change these attribute values to modify the information |
||||||
|
// associated with an assembly. |
||||||
|
|
||||||
|
[assembly: AssemblyTitle("ProtoBench")] |
||||||
|
[assembly: AssemblyDescription("")] |
||||||
|
[assembly: AssemblyConfiguration("")] |
||||||
|
[assembly: AssemblyCompany("")] |
||||||
|
[assembly: AssemblyProduct("ProtoBench")] |
||||||
|
[assembly: AssemblyCopyright("Copyright © 2009")] |
||||||
|
[assembly: AssemblyTrademark("")] |
||||||
|
[assembly: AssemblyCulture("")] |
||||||
|
[assembly: CLSCompliant(true)] |
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values: |
||||||
|
// |
||||||
|
// Major Version |
||||||
|
// Minor Version |
||||||
|
// Build Number |
||||||
|
// Revision |
||||||
|
// |
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers |
||||||
|
// by using the '*' as shown below: |
||||||
|
// [assembly: AssemblyVersion("2.4.1.555")] |
||||||
|
|
||||||
|
[assembly: AssemblyVersion("2.4.1.555")] |
||||||
|
[assembly: AssemblyFileVersion("2.4.1.555")] |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,346 @@ |
|||||||
|
// Generated by ProtoGen, Version=2.4.1.555, Culture=neutral, PublicKeyToken=55f7125234beb589. DO NOT EDIT! |
||||||
|
#pragma warning disable 1591, 0612, 3021 |
||||||
|
#region Designer generated code |
||||||
|
|
||||||
|
using pb = global::Google.ProtocolBuffers; |
||||||
|
using pbc = global::Google.ProtocolBuffers.Collections; |
||||||
|
using pbd = global::Google.ProtocolBuffers.Descriptors; |
||||||
|
using scg = global::System.Collections.Generic; |
||||||
|
namespace Google.ProtocolBuffers.TestProtos { |
||||||
|
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] |
||||||
|
public static partial class UnitTestImportProtoFile { |
||||||
|
|
||||||
|
#region Extension registration |
||||||
|
public static void RegisterAllExtensions(pb::ExtensionRegistry registry) { |
||||||
|
} |
||||||
|
#endregion |
||||||
|
#region Static variables |
||||||
|
internal static pbd::MessageDescriptor internal__static_protobuf_unittest_import_ImportMessage__Descriptor; |
||||||
|
internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ImportMessage, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder> internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable; |
||||||
|
#endregion |
||||||
|
#region Descriptor |
||||||
|
public static pbd::FileDescriptor Descriptor { |
||||||
|
get { return descriptor; } |
||||||
|
} |
||||||
|
private static pbd::FileDescriptor descriptor; |
||||||
|
|
||||||
|
static UnitTestImportProtoFile() { |
||||||
|
byte[] descriptorData = global::System.Convert.FromBase64String( |
||||||
|
string.Concat( |
||||||
|
"CiVnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvEhhwcm90", |
||||||
|
"b2J1Zl91bml0dGVzdF9pbXBvcnQaJGdvb2dsZS9wcm90b2J1Zi9jc2hhcnBf", |
||||||
|
"b3B0aW9ucy5wcm90byIaCg1JbXBvcnRNZXNzYWdlEgkKAWQYASABKAUqPAoK", |
||||||
|
"SW1wb3J0RW51bRIOCgpJTVBPUlRfRk9PEAcSDgoKSU1QT1JUX0JBUhAIEg4K", |
||||||
|
"CklNUE9SVF9CQVoQCUJbChhjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3RIAcI+", |
||||||
|
"PAohR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zEhdVbml0VGVz", |
||||||
|
"dEltcG9ydFByb3RvRmlsZQ==")); |
||||||
|
pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) { |
||||||
|
descriptor = root; |
||||||
|
internal__static_protobuf_unittest_import_ImportMessage__Descriptor = Descriptor.MessageTypes[0]; |
||||||
|
internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable = |
||||||
|
new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ImportMessage, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder>(internal__static_protobuf_unittest_import_ImportMessage__Descriptor, |
||||||
|
new string[] { "D", }); |
||||||
|
pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance(); |
||||||
|
RegisterAllExtensions(registry); |
||||||
|
global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry); |
||||||
|
return registry; |
||||||
|
}; |
||||||
|
pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData, |
||||||
|
new pbd::FileDescriptor[] { |
||||||
|
global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, |
||||||
|
}, assigner); |
||||||
|
} |
||||||
|
#endregion |
||||||
|
|
||||||
|
} |
||||||
|
#region Enums |
||||||
|
public enum ImportEnum { |
||||||
|
IMPORT_FOO = 7, |
||||||
|
IMPORT_BAR = 8, |
||||||
|
IMPORT_BAZ = 9, |
||||||
|
} |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
#region Messages |
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] |
||||||
|
public sealed partial class ImportMessage : pb::GeneratedMessage<ImportMessage, ImportMessage.Builder> { |
||||||
|
private ImportMessage() { } |
||||||
|
private static readonly ImportMessage defaultInstance = new ImportMessage().MakeReadOnly(); |
||||||
|
private static readonly string[] _importMessageFieldNames = new string[] { "d" }; |
||||||
|
private static readonly uint[] _importMessageFieldTags = new uint[] { 8 }; |
||||||
|
public static ImportMessage DefaultInstance { |
||||||
|
get { return defaultInstance; } |
||||||
|
} |
||||||
|
|
||||||
|
public override ImportMessage DefaultInstanceForType { |
||||||
|
get { return DefaultInstance; } |
||||||
|
} |
||||||
|
|
||||||
|
protected override ImportMessage ThisMessage { |
||||||
|
get { return this; } |
||||||
|
} |
||||||
|
|
||||||
|
public static pbd::MessageDescriptor Descriptor { |
||||||
|
get { return global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__Descriptor; } |
||||||
|
} |
||||||
|
|
||||||
|
protected override pb::FieldAccess.FieldAccessorTable<ImportMessage, ImportMessage.Builder> InternalFieldAccessors { |
||||||
|
get { return global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable; } |
||||||
|
} |
||||||
|
|
||||||
|
public const int DFieldNumber = 1; |
||||||
|
private bool hasD; |
||||||
|
private int d_; |
||||||
|
public bool HasD { |
||||||
|
get { return hasD; } |
||||||
|
} |
||||||
|
public int D { |
||||||
|
get { return d_; } |
||||||
|
} |
||||||
|
|
||||||
|
public override bool IsInitialized { |
||||||
|
get { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public override void WriteTo(pb::ICodedOutputStream output) { |
||||||
|
CalcSerializedSize(); |
||||||
|
string[] field_names = _importMessageFieldNames; |
||||||
|
if (hasD) { |
||||||
|
output.WriteInt32(1, field_names[0], D); |
||||||
|
} |
||||||
|
UnknownFields.WriteTo(output); |
||||||
|
} |
||||||
|
|
||||||
|
private int memoizedSerializedSize = -1; |
||||||
|
public override int SerializedSize { |
||||||
|
get { |
||||||
|
int size = memoizedSerializedSize; |
||||||
|
if (size != -1) return size; |
||||||
|
return CalcSerializedSize(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private int CalcSerializedSize() { |
||||||
|
int size = memoizedSerializedSize; |
||||||
|
if (size != -1) return size; |
||||||
|
|
||||||
|
size = 0; |
||||||
|
if (hasD) { |
||||||
|
size += pb::CodedOutputStream.ComputeInt32Size(1, D); |
||||||
|
} |
||||||
|
size += UnknownFields.SerializedSize; |
||||||
|
memoizedSerializedSize = size; |
||||||
|
return size; |
||||||
|
} |
||||||
|
public static ImportMessage ParseFrom(pb::ByteString data) { |
||||||
|
return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); |
||||||
|
} |
||||||
|
public static ImportMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) { |
||||||
|
return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); |
||||||
|
} |
||||||
|
public static ImportMessage ParseFrom(byte[] data) { |
||||||
|
return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed(); |
||||||
|
} |
||||||
|
public static ImportMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) { |
||||||
|
return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed(); |
||||||
|
} |
||||||
|
public static ImportMessage ParseFrom(global::System.IO.Stream input) { |
||||||
|
return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); |
||||||
|
} |
||||||
|
public static ImportMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { |
||||||
|
return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); |
||||||
|
} |
||||||
|
public static ImportMessage ParseDelimitedFrom(global::System.IO.Stream input) { |
||||||
|
return CreateBuilder().MergeDelimitedFrom(input).BuildParsed(); |
||||||
|
} |
||||||
|
public static ImportMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) { |
||||||
|
return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed(); |
||||||
|
} |
||||||
|
public static ImportMessage ParseFrom(pb::ICodedInputStream input) { |
||||||
|
return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed(); |
||||||
|
} |
||||||
|
public static ImportMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { |
||||||
|
return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed(); |
||||||
|
} |
||||||
|
private ImportMessage MakeReadOnly() { |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public static Builder CreateBuilder() { return new Builder(); } |
||||||
|
public override Builder ToBuilder() { return CreateBuilder(this); } |
||||||
|
public override Builder CreateBuilderForType() { return new Builder(); } |
||||||
|
public static Builder CreateBuilder(ImportMessage prototype) { |
||||||
|
return new Builder(prototype); |
||||||
|
} |
||||||
|
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] |
||||||
|
public sealed partial class Builder : pb::GeneratedBuilder<ImportMessage, Builder> { |
||||||
|
protected override Builder ThisBuilder { |
||||||
|
get { return this; } |
||||||
|
} |
||||||
|
public Builder() { |
||||||
|
result = DefaultInstance; |
||||||
|
resultIsReadOnly = true; |
||||||
|
} |
||||||
|
internal Builder(ImportMessage cloneFrom) { |
||||||
|
result = cloneFrom; |
||||||
|
resultIsReadOnly = true; |
||||||
|
} |
||||||
|
|
||||||
|
private bool resultIsReadOnly; |
||||||
|
private ImportMessage result; |
||||||
|
|
||||||
|
private ImportMessage PrepareBuilder() { |
||||||
|
if (resultIsReadOnly) { |
||||||
|
ImportMessage original = result; |
||||||
|
result = new ImportMessage(); |
||||||
|
resultIsReadOnly = false; |
||||||
|
MergeFrom(original); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public override bool IsInitialized { |
||||||
|
get { return result.IsInitialized; } |
||||||
|
} |
||||||
|
|
||||||
|
protected override ImportMessage MessageBeingBuilt { |
||||||
|
get { return PrepareBuilder(); } |
||||||
|
} |
||||||
|
|
||||||
|
public override Builder Clear() { |
||||||
|
result = DefaultInstance; |
||||||
|
resultIsReadOnly = true; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public override Builder Clone() { |
||||||
|
if (resultIsReadOnly) { |
||||||
|
return new Builder(result); |
||||||
|
} else { |
||||||
|
return new Builder().MergeFrom(result); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public override pbd::MessageDescriptor DescriptorForType { |
||||||
|
get { return global::Google.ProtocolBuffers.TestProtos.ImportMessage.Descriptor; } |
||||||
|
} |
||||||
|
|
||||||
|
public override ImportMessage DefaultInstanceForType { |
||||||
|
get { return global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance; } |
||||||
|
} |
||||||
|
|
||||||
|
public override ImportMessage BuildPartial() { |
||||||
|
if (resultIsReadOnly) { |
||||||
|
return result; |
||||||
|
} |
||||||
|
resultIsReadOnly = true; |
||||||
|
return result.MakeReadOnly(); |
||||||
|
} |
||||||
|
|
||||||
|
public override Builder MergeFrom(pb::IMessage other) { |
||||||
|
if (other is ImportMessage) { |
||||||
|
return MergeFrom((ImportMessage) other); |
||||||
|
} else { |
||||||
|
base.MergeFrom(other); |
||||||
|
return this; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public override Builder MergeFrom(ImportMessage other) { |
||||||
|
if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) return this; |
||||||
|
PrepareBuilder(); |
||||||
|
if (other.HasD) { |
||||||
|
D = other.D; |
||||||
|
} |
||||||
|
this.MergeUnknownFields(other.UnknownFields); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public override Builder MergeFrom(pb::ICodedInputStream input) { |
||||||
|
return MergeFrom(input, pb::ExtensionRegistry.Empty); |
||||||
|
} |
||||||
|
|
||||||
|
public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) { |
||||||
|
PrepareBuilder(); |
||||||
|
pb::UnknownFieldSet.Builder unknownFields = null; |
||||||
|
uint tag; |
||||||
|
string field_name; |
||||||
|
while (input.ReadTag(out tag, out field_name)) { |
||||||
|
if(tag == 0 && field_name != null) { |
||||||
|
int field_ordinal = global::System.Array.BinarySearch(_importMessageFieldNames, field_name, global::System.StringComparer.Ordinal); |
||||||
|
if(field_ordinal >= 0) |
||||||
|
tag = _importMessageFieldTags[field_ordinal]; |
||||||
|
else { |
||||||
|
if (unknownFields == null) { |
||||||
|
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); |
||||||
|
} |
||||||
|
ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
switch (tag) { |
||||||
|
case 0: { |
||||||
|
throw pb::InvalidProtocolBufferException.InvalidTag(); |
||||||
|
} |
||||||
|
default: { |
||||||
|
if (pb::WireFormat.IsEndGroupTag(tag)) { |
||||||
|
if (unknownFields != null) { |
||||||
|
this.UnknownFields = unknownFields.Build(); |
||||||
|
} |
||||||
|
return this; |
||||||
|
} |
||||||
|
if (unknownFields == null) { |
||||||
|
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); |
||||||
|
} |
||||||
|
ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name); |
||||||
|
break; |
||||||
|
} |
||||||
|
case 8: { |
||||||
|
result.hasD = input.ReadInt32(ref result.d_); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (unknownFields != null) { |
||||||
|
this.UnknownFields = unknownFields.Build(); |
||||||
|
} |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public bool HasD { |
||||||
|
get { return result.hasD; } |
||||||
|
} |
||||||
|
public int D { |
||||||
|
get { return result.D; } |
||||||
|
set { SetD(value); } |
||||||
|
} |
||||||
|
public Builder SetD(int value) { |
||||||
|
PrepareBuilder(); |
||||||
|
result.hasD = true; |
||||||
|
result.d_ = value; |
||||||
|
return this; |
||||||
|
} |
||||||
|
public Builder ClearD() { |
||||||
|
PrepareBuilder(); |
||||||
|
result.hasD = false; |
||||||
|
result.d_ = 0; |
||||||
|
return this; |
||||||
|
} |
||||||
|
} |
||||||
|
static ImportMessage() { |
||||||
|
object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.Descriptor, null); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endregion Designer generated code |
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@ -0,0 +1,88 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System; |
||||||
|
using System.IO; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoDump |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// Small utility to load a binary message and dump it in text form |
||||||
|
/// </summary> |
||||||
|
internal class Program |
||||||
|
{ |
||||||
|
private static int Main(string[] args) |
||||||
|
{ |
||||||
|
if (args.Length != 2) |
||||||
|
{ |
||||||
|
Console.Error.WriteLine("Usage: ProtoDump <descriptor type name> <input data>"); |
||||||
|
Console.Error.WriteLine("The descriptor type name is the fully-qualified message name,"); |
||||||
|
Console.Error.WriteLine("including assembly e.g. ProjectNamespace.Message,Company.Project"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
IMessage defaultMessage; |
||||||
|
try |
||||||
|
{ |
||||||
|
defaultMessage = MessageUtil.GetDefaultMessage(args[0]); |
||||||
|
} |
||||||
|
catch (ArgumentException e) |
||||||
|
{ |
||||||
|
Console.Error.WriteLine(e.Message); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
try |
||||||
|
{ |
||||||
|
IBuilder builder = defaultMessage.WeakCreateBuilderForType(); |
||||||
|
if (builder == null) |
||||||
|
{ |
||||||
|
Console.Error.WriteLine("Unable to create builder"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
byte[] inputData = File.ReadAllBytes(args[1]); |
||||||
|
builder.WeakMergeFrom(ByteString.CopyFrom(inputData)); |
||||||
|
Console.WriteLine(TextFormat.PrintToString(builder.WeakBuild())); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
catch (Exception e) |
||||||
|
{ |
||||||
|
Console.Error.WriteLine("Error: {0}", e.Message); |
||||||
|
Console.Error.WriteLine(); |
||||||
|
Console.Error.WriteLine("Detailed exception information: {0}", e); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
using System.Reflection; |
||||||
|
using System.Runtime.CompilerServices; |
||||||
|
using System.Runtime.InteropServices; |
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following |
||||||
|
// set of attributes. Change these attribute values to modify the information |
||||||
|
// associated with an assembly. |
||||||
|
|
||||||
|
[assembly: AssemblyTitle("ProtoDump")] |
||||||
|
[assembly: AssemblyDescription("")] |
||||||
|
[assembly: AssemblyConfiguration("")] |
||||||
|
[assembly: AssemblyCompany("")] |
||||||
|
[assembly: AssemblyProduct("ProtoDump")] |
||||||
|
[assembly: AssemblyCopyright("Copyright © 2009")] |
||||||
|
[assembly: AssemblyTrademark("")] |
||||||
|
[assembly: AssemblyCulture("")] |
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values: |
||||||
|
// |
||||||
|
// Major Version |
||||||
|
// Minor Version |
||||||
|
// Build Number |
||||||
|
// Revision |
||||||
|
// |
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers |
||||||
|
// by using the '*' as shown below: |
||||||
|
// [assembly: AssemblyVersion("2.4.1.555")] |
||||||
|
|
||||||
|
[assembly: AssemblyVersion("2.4.1.555")] |
||||||
|
[assembly: AssemblyFileVersion("2.4.1.555")] |
@ -0,0 +1,150 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System.Collections.Generic; |
||||||
|
using Google.ProtocolBuffers.DescriptorProtos; |
||||||
|
using Google.ProtocolBuffers.Descriptors; |
||||||
|
using NUnit.Framework; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// Tests for the dependency resolution in Generator. |
||||||
|
/// </summary> |
||||||
|
[TestFixture] |
||||||
|
public class DependencyResolutionTest |
||||||
|
{ |
||||||
|
[Test] |
||||||
|
public void TwoDistinctFiles() |
||||||
|
{ |
||||||
|
FileDescriptorProto first = new FileDescriptorProto.Builder {Name = "First"}.Build(); |
||||||
|
FileDescriptorProto second = new FileDescriptorProto.Builder {Name = "Second"}.Build(); |
||||||
|
var set = new List<FileDescriptorProto> { first, second }; |
||||||
|
|
||||||
|
IList<FileDescriptor> converted = Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||||
|
Assert.AreEqual(2, converted.Count); |
||||||
|
Assert.AreEqual("First", converted[0].Name); |
||||||
|
Assert.AreEqual(0, converted[0].Dependencies.Count); |
||||||
|
Assert.AreEqual("Second", converted[1].Name); |
||||||
|
Assert.AreEqual(0, converted[1].Dependencies.Count); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void FirstDependsOnSecond() |
||||||
|
{ |
||||||
|
FileDescriptorProto first = |
||||||
|
new FileDescriptorProto.Builder {Name = "First", DependencyList = {"Second"}}.Build(); |
||||||
|
FileDescriptorProto second = new FileDescriptorProto.Builder {Name = "Second"}.Build(); |
||||||
|
var set = new List<FileDescriptorProto> { first, second }; |
||||||
|
IList<FileDescriptor> converted = Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||||
|
Assert.AreEqual(2, converted.Count); |
||||||
|
Assert.AreEqual("First", converted[0].Name); |
||||||
|
Assert.AreEqual(1, converted[0].Dependencies.Count); |
||||||
|
Assert.AreEqual(converted[1], converted[0].Dependencies[0]); |
||||||
|
Assert.AreEqual("Second", converted[1].Name); |
||||||
|
Assert.AreEqual(0, converted[1].Dependencies.Count); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void SecondDependsOnFirst() |
||||||
|
{ |
||||||
|
FileDescriptorProto first = new FileDescriptorProto.Builder {Name = "First"}.Build(); |
||||||
|
FileDescriptorProto second = |
||||||
|
new FileDescriptorProto.Builder {Name = "Second", DependencyList = {"First"}}.Build(); |
||||||
|
var set = new List<FileDescriptorProto> { first, second }; |
||||||
|
IList<FileDescriptor> converted = Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||||
|
Assert.AreEqual(2, converted.Count); |
||||||
|
Assert.AreEqual("First", converted[0].Name); |
||||||
|
Assert.AreEqual(0, converted[0].Dependencies.Count); |
||||||
|
Assert.AreEqual("Second", converted[1].Name); |
||||||
|
Assert.AreEqual(1, converted[1].Dependencies.Count); |
||||||
|
Assert.AreEqual(converted[0], converted[1].Dependencies[0]); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CircularDependency() |
||||||
|
{ |
||||||
|
FileDescriptorProto first = |
||||||
|
new FileDescriptorProto.Builder {Name = "First", DependencyList = {"Second"}}.Build(); |
||||||
|
FileDescriptorProto second = |
||||||
|
new FileDescriptorProto.Builder {Name = "Second", DependencyList = {"First"}}.Build(); |
||||||
|
var set = new List<FileDescriptorProto> { first, second }; |
||||||
|
try |
||||||
|
{ |
||||||
|
Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||||
|
Assert.Fail("Expected exception"); |
||||||
|
} |
||||||
|
catch (DependencyResolutionException) |
||||||
|
{ |
||||||
|
// Expected |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void MissingDependency() |
||||||
|
{ |
||||||
|
FileDescriptorProto first = |
||||||
|
new FileDescriptorProto.Builder {Name = "First", DependencyList = {"Second"}}.Build(); |
||||||
|
var set = new List<FileDescriptorProto> { first }; |
||||||
|
try |
||||||
|
{ |
||||||
|
Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||||
|
Assert.Fail("Expected exception"); |
||||||
|
} |
||||||
|
catch (DependencyResolutionException) |
||||||
|
{ |
||||||
|
// Expected |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void SelfDependency() |
||||||
|
{ |
||||||
|
FileDescriptorProto first = |
||||||
|
new FileDescriptorProto.Builder {Name = "First", DependencyList = {"First"}}.Build(); |
||||||
|
var set = new List<FileDescriptorProto> { first }; |
||||||
|
try |
||||||
|
{ |
||||||
|
Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set); |
||||||
|
Assert.Fail("Expected exception"); |
||||||
|
} |
||||||
|
catch (DependencyResolutionException) |
||||||
|
{ |
||||||
|
// Expected |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
using System.Reflection; |
||||||
|
using System.Runtime.CompilerServices; |
||||||
|
using System.Runtime.InteropServices; |
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following |
||||||
|
// set of attributes. Change these attribute values to modify the information |
||||||
|
// associated with an assembly. |
||||||
|
|
||||||
|
[assembly: AssemblyTitle("ProtoGen.Test")] |
||||||
|
[assembly: AssemblyDescription("")] |
||||||
|
[assembly: AssemblyConfiguration("")] |
||||||
|
[assembly: AssemblyCompany("")] |
||||||
|
[assembly: AssemblyProduct("ProtoGen.Test")] |
||||||
|
[assembly: AssemblyCopyright("Copyright © 2008")] |
||||||
|
[assembly: AssemblyTrademark("")] |
||||||
|
[assembly: AssemblyCulture("")] |
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values: |
||||||
|
// |
||||||
|
// Major Version |
||||||
|
// Minor Version |
||||||
|
// Build Number |
||||||
|
// Revision |
||||||
|
// |
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers |
||||||
|
// by using the '*' as shown below: |
||||||
|
// [assembly: AssemblyVersion("2.4.1.555")] |
||||||
|
|
||||||
|
[assembly: AssemblyVersion("2.4.1.555")] |
||||||
|
[assembly: AssemblyFileVersion("2.4.1.555")] |
@ -0,0 +1,683 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using NUnit.Framework; |
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Diagnostics; |
||||||
|
using System.IO; |
||||||
|
using System.Reflection; |
||||||
|
using System.Text; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// Tests protoc-gen-cs plugin. |
||||||
|
/// </summary> |
||||||
|
[TestFixture] |
||||||
|
[Category("Preprocessor")] |
||||||
|
public partial class ProtocGenCsUnittests |
||||||
|
{ |
||||||
|
private static readonly string TempPath = Path.Combine(Path.GetTempPath(), "protoc-gen-cs.Test"); |
||||||
|
|
||||||
|
private const string DefaultProto = |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
}";
|
||||||
|
|
||||||
|
#region TestFixture SetUp/TearDown |
||||||
|
|
||||||
|
private static readonly string OriginalWorkingDirectory = Environment.CurrentDirectory; |
||||||
|
|
||||||
|
private StringBuilder buffer = new StringBuilder(); |
||||||
|
|
||||||
|
[TestFixtureSetUp] |
||||||
|
public virtual void Setup() |
||||||
|
{ |
||||||
|
Teardown(); |
||||||
|
Directory.CreateDirectory(TempPath); |
||||||
|
Environment.CurrentDirectory = TempPath; |
||||||
|
this.buffer.Length = 0; |
||||||
|
} |
||||||
|
|
||||||
|
[TestFixtureTearDown] |
||||||
|
public virtual void Teardown() |
||||||
|
{ |
||||||
|
Environment.CurrentDirectory = OriginalWorkingDirectory; |
||||||
|
if (Directory.Exists(TempPath)) |
||||||
|
{ |
||||||
|
Directory.Delete(TempPath, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
#region Helper Methods RunProtoGen / RunCsc |
||||||
|
|
||||||
|
private void RunProtoc(int expect, string protoFile, params string[] args) |
||||||
|
{ |
||||||
|
string protoPath = string.Format("-I. -I\"{0}\"", OriginalWorkingDirectory); |
||||||
|
string plugin = string.Format("--plugin=\"{0}\"", Path.Combine(OriginalWorkingDirectory, "protoc-gen-cs.exe")); |
||||||
|
string csOut = args.Length == 0 ? "--cs_out=." : string.Format("--cs_out=\"{0}:.\"", string.Join(" ", args)); |
||||||
|
// Start the child process. |
||||||
|
Process p = new Process(); |
||||||
|
// Redirect the output stream of the child process. |
||||||
|
p.StartInfo.CreateNoWindow = true; |
||||||
|
p.StartInfo.UseShellExecute = false; |
||||||
|
p.StartInfo.RedirectStandardError = true; |
||||||
|
p.StartInfo.RedirectStandardOutput = true; |
||||||
|
p.StartInfo.WorkingDirectory = TempPath; |
||||||
|
p.StartInfo.FileName = Path.Combine(OriginalWorkingDirectory, "protoc.exe"); |
||||||
|
p.StartInfo.Arguments = string.Join(" ", new string[] { plugin, csOut, protoPath, protoFile }); |
||||||
|
p.Start(); |
||||||
|
// Read the output stream first and then wait. |
||||||
|
buffer.AppendLine(string.Format("{0}> \"{1}\" {2}", p.StartInfo.WorkingDirectory, p.StartInfo.FileName, p.StartInfo.Arguments)); |
||||||
|
buffer.AppendLine(p.StandardError.ReadToEnd()); |
||||||
|
buffer.AppendLine(p.StandardOutput.ReadToEnd()); |
||||||
|
p.WaitForExit(); |
||||||
|
Assert.AreEqual(expect, p.ExitCode, this.buffer.ToString()); |
||||||
|
} |
||||||
|
|
||||||
|
private Assembly RunCsc(int expect, params string[] sources) |
||||||
|
{ |
||||||
|
using (TempFile tempDll = new TempFile(String.Empty)) |
||||||
|
{ |
||||||
|
tempDll.ChangeExtension(".dll"); |
||||||
|
List<string> args = new List<string>(); |
||||||
|
args.Add("/nologo"); |
||||||
|
args.Add("/target:library"); |
||||||
|
args.Add("/debug-"); |
||||||
|
args.Add(String.Format(@"""/out:{0}""", tempDll.TempPath)); |
||||||
|
args.Add("/r:System.dll"); |
||||||
|
args.Add(String.Format(@"""/r:{0}""", |
||||||
|
typeof(Google.ProtocolBuffers.DescriptorProtos.DescriptorProto).Assembly. |
||||||
|
Location)); |
||||||
|
args.AddRange(sources); |
||||||
|
|
||||||
|
string exe = Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), |
||||||
|
"csc.exe"); |
||||||
|
ProcessStartInfo psi = new ProcessStartInfo(exe); |
||||||
|
psi.WorkingDirectory = TempPath; |
||||||
|
psi.CreateNoWindow = true; |
||||||
|
psi.UseShellExecute = false; |
||||||
|
psi.RedirectStandardOutput = true; |
||||||
|
psi.RedirectStandardError = true; |
||||||
|
psi.Arguments = string.Join(" ", args.ToArray()); |
||||||
|
Process p = Process.Start(psi); |
||||||
|
buffer.AppendLine(string.Format("{0}> \"{1}\" {2}", p.StartInfo.WorkingDirectory, p.StartInfo.FileName, p.StartInfo.Arguments)); |
||||||
|
buffer.AppendLine(p.StandardError.ReadToEnd()); |
||||||
|
buffer.AppendLine(p.StandardOutput.ReadToEnd()); |
||||||
|
p.WaitForExit(); |
||||||
|
Assert.AreEqual(expect, p.ExitCode, this.buffer.ToString()); |
||||||
|
|
||||||
|
Assembly asm = null; |
||||||
|
if (p.ExitCode == 0) |
||||||
|
{ |
||||||
|
byte[] allbytes = File.ReadAllBytes(tempDll.TempPath); |
||||||
|
asm = Assembly.Load(allbytes); |
||||||
|
|
||||||
|
foreach (Type t in asm.GetTypes()) |
||||||
|
{ |
||||||
|
Debug.WriteLine(t.FullName, asm.FullName); |
||||||
|
} |
||||||
|
} |
||||||
|
return asm; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
// ******************************************************************* |
||||||
|
// The following tests excercise options for protogen.exe |
||||||
|
// ******************************************************************* |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFile() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoc(0, proto.TempPath); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithConflictingType() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message " +
|
||||||
|
test + @" {
|
||||||
|
optional string name = 1; |
||||||
|
} "))
|
||||||
|
{ |
||||||
|
RunProtoc(0, proto.TempPath); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple." + test, true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.Proto." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithNamespace() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoc(0, proto.TempPath, "-namespace=MyNewNamespace"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("MyNewNamespace." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithUmbrellaClassName() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach("MyUmbrellaClassname.cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoc(0, proto.TempPath, "/umbrella_classname=MyUmbrellaClassname"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.MyUmbrellaClassname", true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithNestedClass() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoc(0, proto.TempPath, "-nest_classes=true"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithExpandedNsDirectories() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(@"nunit\simple\" + test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoc(0, proto.TempPath, "-expand_namespace_directories=true"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithNewExtension() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".Generated.cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoc(0, proto.TempPath, "-file_extension=.Generated.cs"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithUmbrellaNamespace() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoc(0, proto.TempPath, "-umbrella_namespace=MyUmbrella.Namespace"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.MyUmbrella.Namespace." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithIgnoredUmbrellaNamespaceDueToNesting() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoc(0, proto.TempPath, "-nest_classes=true", "-umbrella_namespace=MyUmbrella.Namespace"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithExplicitEmptyUmbrellaNamespace() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message " +
|
||||||
|
test + @" {
|
||||||
|
optional string name = 1; |
||||||
|
} "))
|
||||||
|
{ |
||||||
|
//Forces the umbrella class to not use a namespace even if a collision with a type is detected. |
||||||
|
RunProtoc(0, proto.TempPath, "-umbrella_namespace="); |
||||||
|
//error CS0441: 'nunit.simple.TestProtoFileWithExplicitEmptyUmbrellaNamespace': a class cannot be both static and sealed |
||||||
|
RunCsc(1, source.TempPath); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithNewOutputFolder() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(@"generated-code\" + test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoc(1, proto.TempPath, "-output_directory=generated-code"); |
||||||
|
Directory.CreateDirectory("generated-code"); |
||||||
|
RunProtoc(0, proto.TempPath, "-output_directory=generated-code"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileAndIgnoreGoogleProtobuf() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||||
|
" +
|
||||||
|
DefaultProto)) |
||||||
|
{ |
||||||
|
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||||
|
Directory.CreateDirectory(google); |
||||||
|
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||||
|
{ |
||||||
|
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||||
|
} |
||||||
|
|
||||||
|
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
RunProtoc(0, proto.TempPath); |
||||||
|
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
|
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("MyNewNamespace." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithoutIgnoreGoogleProtobuf() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||||
|
" +
|
||||||
|
DefaultProto)) |
||||||
|
{ |
||||||
|
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||||
|
Directory.CreateDirectory(google); |
||||||
|
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||||
|
{ |
||||||
|
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||||
|
} |
||||||
|
|
||||||
|
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
//Without the option this fails due to being unable to resolve google/protobuf descriptors |
||||||
|
RunProtoc(0, proto.TempPath); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// ******************************************************************* |
||||||
|
// The following tests excercise options for protoc.exe |
||||||
|
// ******************************************************************* |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithIncludeImports() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||||
|
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
} ")
|
||||||
|
) |
||||||
|
{ |
||||||
|
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||||
|
Directory.CreateDirectory(google); |
||||||
|
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||||
|
{ |
||||||
|
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||||
|
} |
||||||
|
|
||||||
|
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
//if you specify the protoc option --include_imports this should build three source files |
||||||
|
RunProtoc(0, proto.TempPath); |
||||||
|
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
|
||||||
|
//you can (and should) simply omit the inclusion of the extra source files in your project |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("MyNewNamespace." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
//Seems the --proto_path or -I option is non-functional for me. Maybe others have luck? |
||||||
|
[Test] |
||||||
|
public void TestProtoFileInDifferentDirectory() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
Environment.CurrentDirectory = OriginalWorkingDirectory; |
||||||
|
RunProtoc(0, proto.TempPath); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// ******************************************************************* |
||||||
|
// Handling of mutliple input files |
||||||
|
// ******************************************************************* |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestMultipleProtoFiles() |
||||||
|
{ |
||||||
|
Setup(); |
||||||
|
using (TempFile source1 = TempFile.Attach("MyMessage.cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto1 = new ProtoFile("MyMessage.proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
}")
|
||||||
|
) |
||||||
|
using (TempFile source2 = TempFile.Attach("MyMessageList.cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto2 = new ProtoFile("MyMessageList.proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
import ""MyMessage.proto""; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessageList { |
||||||
|
repeated MyMessage messages = 1; |
||||||
|
}")
|
||||||
|
) |
||||||
|
{ |
||||||
|
RunProtoc(0, proto1.TempPath); |
||||||
|
RunProtoc(0, proto2.TempPath); |
||||||
|
Assembly a = RunCsc(0, source1.TempPath, source2.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t1 = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage"); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t2 = a.GetType("nunit.simple.MyMessageList", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.Proto.MyMessage", true, true); |
||||||
|
a.GetType("nunit.simple.Proto.MyMessageList", true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestOneProtoFileWithBufferFile() |
||||||
|
{ |
||||||
|
Setup(); |
||||||
|
using (TempFile source1 = TempFile.Attach("MyMessage.cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto1 = new ProtoFile("MyMessage.proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
}")
|
||||||
|
) |
||||||
|
using (TempFile source2 = TempFile.Attach("MyMessageList.cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto2 = new ProtoFile("MyMessageList.proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
import ""MyMessage.proto""; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessageList { |
||||||
|
repeated MyMessage messages = 1; |
||||||
|
}")
|
||||||
|
) |
||||||
|
{ |
||||||
|
//build the proto buffer for MyMessage |
||||||
|
RunProtoc(0, proto1.TempPath); |
||||||
|
//build the MyMessageList proto-buffer and generate code by including MyMessage.pb |
||||||
|
RunProtoc(0, proto2.TempPath); |
||||||
|
Assembly a = RunCsc(0, source1.TempPath, source2.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t1 = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage"); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t2 = a.GetType("nunit.simple.MyMessageList", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.Proto.MyMessage", true, true); |
||||||
|
a.GetType("nunit.simple.Proto.MyMessageList", true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithService() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||||
|
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
} |
||||||
|
// test a very simple service. |
||||||
|
service TestService { |
||||||
|
rpc Execute (MyMessage) returns (MyMessage); |
||||||
|
}"))
|
||||||
|
{ |
||||||
|
CopyInGoogleProtoFiles(); |
||||||
|
|
||||||
|
RunProtoc(0, proto.TempPath, "-nest_classes=false"); |
||||||
|
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
|
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the service type is in the expected namespace |
||||||
|
Type t1 = a.GetType("nunit.simple.TestService", true, true); |
||||||
|
Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); |
||||||
|
Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); |
||||||
|
//assert that the Stub subclass type is in the expected namespace |
||||||
|
Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); |
||||||
|
Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); |
||||||
|
Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithServiceInternal() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||||
|
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
} |
||||||
|
// test a very simple service. |
||||||
|
service TestService { |
||||||
|
rpc Execute (MyMessage) returns (MyMessage); |
||||||
|
}"))
|
||||||
|
{ |
||||||
|
CopyInGoogleProtoFiles(); |
||||||
|
|
||||||
|
RunProtoc(0, proto.TempPath, "-nest_classes=false", "-public_classes=false"); |
||||||
|
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
|
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the service type is in the expected namespace |
||||||
|
Type t1 = a.GetType("nunit.simple.TestService", true, true); |
||||||
|
Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); |
||||||
|
Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); |
||||||
|
//assert that the Stub subclass type is in the expected namespace |
||||||
|
Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); |
||||||
|
Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); |
||||||
|
Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static void CopyInGoogleProtoFiles() |
||||||
|
{ |
||||||
|
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||||
|
Directory.CreateDirectory(google); |
||||||
|
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||||
|
{ |
||||||
|
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,59 @@ |
|||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.IO; |
||||||
|
using System.Text; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
internal class ProtoFile : TempFile |
||||||
|
{ |
||||||
|
public ProtoFile(string filename, string contents) |
||||||
|
: base(filename, contents) |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
internal class TempFile : IDisposable |
||||||
|
{ |
||||||
|
private string tempFile; |
||||||
|
|
||||||
|
public static TempFile Attach(string path) |
||||||
|
{ |
||||||
|
return new TempFile(path, null); |
||||||
|
} |
||||||
|
|
||||||
|
protected TempFile(string filename, string contents) |
||||||
|
{ |
||||||
|
tempFile = filename; |
||||||
|
if (contents != null) |
||||||
|
{ |
||||||
|
File.WriteAllText(tempFile, contents, new UTF8Encoding(false)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public TempFile(string contents) |
||||||
|
: this(Path.GetTempFileName(), contents) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public string TempPath |
||||||
|
{ |
||||||
|
get { return tempFile; } |
||||||
|
} |
||||||
|
|
||||||
|
public void ChangeExtension(string ext) |
||||||
|
{ |
||||||
|
string newFile = Path.ChangeExtension(tempFile, ext); |
||||||
|
File.Move(tempFile, newFile); |
||||||
|
tempFile = newFile; |
||||||
|
} |
||||||
|
|
||||||
|
public void Dispose() |
||||||
|
{ |
||||||
|
if (File.Exists(tempFile)) |
||||||
|
{ |
||||||
|
File.Delete(tempFile); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,733 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Diagnostics; |
||||||
|
using System.IO; |
||||||
|
using System.Reflection; |
||||||
|
using NUnit.Framework; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
[Category("Preprocessor")] |
||||||
|
public partial class TestPreprocessing |
||||||
|
{ |
||||||
|
private static readonly string TempPath = Path.Combine(Path.GetTempPath(), "proto-gen-test"); |
||||||
|
|
||||||
|
private const string DefaultProto = |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
}";
|
||||||
|
|
||||||
|
#region TestFixture SetUp/TearDown |
||||||
|
|
||||||
|
private static readonly string OriginalWorkingDirectory = Environment.CurrentDirectory; |
||||||
|
|
||||||
|
[TestFixtureSetUp] |
||||||
|
public virtual void Setup() |
||||||
|
{ |
||||||
|
Teardown(); |
||||||
|
Directory.CreateDirectory(TempPath); |
||||||
|
Environment.CurrentDirectory = TempPath; |
||||||
|
} |
||||||
|
|
||||||
|
[TestFixtureTearDown] |
||||||
|
public virtual void Teardown() |
||||||
|
{ |
||||||
|
Environment.CurrentDirectory = OriginalWorkingDirectory; |
||||||
|
if (Directory.Exists(TempPath)) |
||||||
|
{ |
||||||
|
Directory.Delete(TempPath, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
#region Helper Methods RunProtoGen / RunCsc |
||||||
|
|
||||||
|
private void RunProtoGen(int expect, params string[] args) |
||||||
|
{ |
||||||
|
TextWriter tout = Console.Out, terr = Console.Error; |
||||||
|
StringWriter temp = new StringWriter(); |
||||||
|
Console.SetOut(temp); |
||||||
|
Console.SetError(temp); |
||||||
|
try |
||||||
|
{ |
||||||
|
Assert.AreEqual(expect, ProgramPreprocess.Run(args), "ProtoGen Failed: {0}", temp); |
||||||
|
} |
||||||
|
finally |
||||||
|
{ |
||||||
|
Console.SetOut(tout); |
||||||
|
Console.SetError(terr); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private Assembly RunCsc(int expect, params string[] sources) |
||||||
|
{ |
||||||
|
using (TempFile tempDll = new TempFile(String.Empty)) |
||||||
|
{ |
||||||
|
tempDll.ChangeExtension(".dll"); |
||||||
|
List<string> args = new List<string>(); |
||||||
|
args.Add("/nologo"); |
||||||
|
args.Add("/target:library"); |
||||||
|
args.Add("/debug-"); |
||||||
|
args.Add(String.Format(@"""/out:{0}""", tempDll.TempPath)); |
||||||
|
args.Add("/r:System.dll"); |
||||||
|
args.Add(String.Format(@"""/r:{0}""", |
||||||
|
typeof(Google.ProtocolBuffers.DescriptorProtos.DescriptorProto).Assembly. |
||||||
|
Location)); |
||||||
|
args.AddRange(sources); |
||||||
|
|
||||||
|
string exe = Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), |
||||||
|
"csc.exe"); |
||||||
|
ProcessStartInfo psi = new ProcessStartInfo(exe); |
||||||
|
psi.CreateNoWindow = true; |
||||||
|
psi.UseShellExecute = false; |
||||||
|
psi.RedirectStandardOutput = true; |
||||||
|
psi.RedirectStandardError = true; |
||||||
|
psi.Arguments = string.Join(" ", args.ToArray()); |
||||||
|
Process p = Process.Start(psi); |
||||||
|
p.WaitForExit(); |
||||||
|
string errorText = p.StandardOutput.ReadToEnd() + p.StandardError.ReadToEnd(); |
||||||
|
Assert.AreEqual(expect, p.ExitCode, "CSC.exe Failed: {0}", errorText); |
||||||
|
|
||||||
|
Assembly asm = null; |
||||||
|
if (p.ExitCode == 0) |
||||||
|
{ |
||||||
|
byte[] allbytes = File.ReadAllBytes(tempDll.TempPath); |
||||||
|
asm = Assembly.Load(allbytes); |
||||||
|
|
||||||
|
foreach (Type t in asm.GetTypes()) |
||||||
|
{ |
||||||
|
Debug.WriteLine(t.FullName, asm.FullName); |
||||||
|
} |
||||||
|
} |
||||||
|
return asm; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
// ******************************************************************* |
||||||
|
// The following tests excercise options for protogen.exe |
||||||
|
// ******************************************************************* |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFile() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithConflictingType() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message " +
|
||||||
|
test + @" {
|
||||||
|
optional string name = 1; |
||||||
|
} "))
|
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple." + test, true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.Proto." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithNamespace() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath, "-namespace:MyNewNamespace"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("MyNewNamespace." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithUmbrellaClassName() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach("MyUmbrellaClassname.cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath, "/umbrella_classname=MyUmbrellaClassname"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.MyUmbrellaClassname", true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithNestedClass() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath, "-nest_classes:true"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithExpandedNsDirectories() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(@"nunit\simple\" + test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath, "-expand_namespace_directories:true"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithNewExtension() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".Generated.cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath, "-file_extension:.Generated.cs"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithUmbrellaNamespace() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath, "-umbrella_namespace:MyUmbrella.Namespace"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.MyUmbrella.Namespace." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithIgnoredUmbrellaNamespaceDueToNesting() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath, "-nest_classes:true", "-umbrella_namespace:MyUmbrella.Namespace"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithExplicitEmptyUmbrellaNamespace() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message " +
|
||||||
|
test + @" {
|
||||||
|
optional string name = 1; |
||||||
|
} "))
|
||||||
|
{ |
||||||
|
//Forces the umbrella class to not use a namespace even if a collision with a type is detected. |
||||||
|
RunProtoGen(0, proto.TempPath, "-umbrella_namespace:"); |
||||||
|
//error CS0441: 'nunit.simple.TestProtoFileWithExplicitEmptyUmbrellaNamespace': a class cannot be both static and sealed |
||||||
|
RunCsc(1, source.TempPath); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithNewOutputFolder() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(@"generated-code\" + test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
RunProtoGen(1, proto.TempPath, "-output_directory:generated-code"); |
||||||
|
Directory.CreateDirectory("generated-code"); |
||||||
|
RunProtoGen(0, proto.TempPath, "-output_directory:generated-code"); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileAndIgnoreGoogleProtobuf() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||||
|
" +
|
||||||
|
DefaultProto)) |
||||||
|
{ |
||||||
|
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||||
|
Directory.CreateDirectory(google); |
||||||
|
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||||
|
{ |
||||||
|
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||||
|
} |
||||||
|
|
||||||
|
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true"); |
||||||
|
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
|
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("MyNewNamespace." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithoutIgnoreGoogleProtobuf() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||||
|
" +
|
||||||
|
DefaultProto)) |
||||||
|
{ |
||||||
|
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||||
|
Directory.CreateDirectory(google); |
||||||
|
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||||
|
{ |
||||||
|
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||||
|
} |
||||||
|
|
||||||
|
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
//Without the option this fails due to being unable to resolve google/protobuf descriptors |
||||||
|
RunProtoGen(1, proto.TempPath, "-ignore_google_protobuf:false"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// ******************************************************************* |
||||||
|
// The following tests excercise options for protoc.exe |
||||||
|
// ******************************************************************* |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithIncludeImports() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||||
|
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
} ")
|
||||||
|
) |
||||||
|
{ |
||||||
|
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||||
|
Directory.CreateDirectory(google); |
||||||
|
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||||
|
{ |
||||||
|
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||||
|
} |
||||||
|
|
||||||
|
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
//if you specify the protoc option --include_imports this should build three source files |
||||||
|
RunProtoGen(0, proto.TempPath, "--include_imports"); |
||||||
|
Assert.AreEqual(3, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
|
||||||
|
//you can (and should) simply omit the inclusion of the extra source files in your project |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("MyNewNamespace." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithIncludeImportsAndIgnoreGoogleProtobuf() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace""; |
||||||
|
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
} ")
|
||||||
|
) |
||||||
|
{ |
||||||
|
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||||
|
Directory.CreateDirectory(google); |
||||||
|
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||||
|
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||||
|
|
||||||
|
Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
//Even with --include_imports, if you provide -ignore_google_protobuf:true you only get the one source file |
||||||
|
RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "--include_imports"); |
||||||
|
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
|
||||||
|
//you can (and should) simply omit the inclusion of the extra source files in your project |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("MyNewNamespace.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("MyNewNamespace." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileKeepingTheProtoBuffer() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile protobuf = TempFile.Attach(test + ".pb")) |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
} ")
|
||||||
|
) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto.TempPath, "--descriptor_set_out=" + protobuf.TempPath); |
||||||
|
Assert.IsTrue(File.Exists(protobuf.TempPath), "Missing: " + protobuf.TempPath); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
//Seems the --proto_path or -I option is non-functional for me. Maybe others have luck? |
||||||
|
[Test] |
||||||
|
public void TestProtoFileInDifferentDirectory() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto)) |
||||||
|
{ |
||||||
|
Environment.CurrentDirectory = OriginalWorkingDirectory; |
||||||
|
RunProtoGen(0, proto.TempPath, "--proto_path=" + TempPath); |
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple." + test, true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// ******************************************************************* |
||||||
|
// Handling of mutliple input files |
||||||
|
// ******************************************************************* |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestMultipleProtoFiles() |
||||||
|
{ |
||||||
|
Setup(); |
||||||
|
using (TempFile source1 = TempFile.Attach("MyMessage.cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto1 = new ProtoFile("MyMessage.proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
}")
|
||||||
|
) |
||||||
|
using (TempFile source2 = TempFile.Attach("MyMessageList.cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto2 = new ProtoFile("MyMessageList.proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
import ""MyMessage.proto""; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessageList { |
||||||
|
repeated MyMessage messages = 1; |
||||||
|
}")
|
||||||
|
) |
||||||
|
{ |
||||||
|
RunProtoGen(0, proto1.TempPath, proto2.TempPath); |
||||||
|
Assembly a = RunCsc(0, source1.TempPath, source2.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t1 = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage"); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t2 = a.GetType("nunit.simple.MyMessageList", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.Proto.MyMessage", true, true); |
||||||
|
a.GetType("nunit.simple.Proto.MyMessageList", true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestOneProtoFileWithBufferFile() |
||||||
|
{ |
||||||
|
Setup(); |
||||||
|
using (TempFile source1 = TempFile.Attach("MyMessage.cs")) |
||||||
|
using (TempFile protobuf = TempFile.Attach("MyMessage.pb")) |
||||||
|
using ( |
||||||
|
ProtoFile proto1 = new ProtoFile("MyMessage.proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
}")
|
||||||
|
) |
||||||
|
using (TempFile source2 = TempFile.Attach("MyMessageList.cs")) |
||||||
|
using ( |
||||||
|
ProtoFile proto2 = new ProtoFile("MyMessageList.proto", |
||||||
|
@"
|
||||||
|
package nunit.simple; |
||||||
|
import ""MyMessage.proto""; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessageList { |
||||||
|
repeated MyMessage messages = 1; |
||||||
|
}")
|
||||||
|
) |
||||||
|
{ |
||||||
|
//build the proto buffer for MyMessage |
||||||
|
RunProtoGen(0, proto1.TempPath, "--descriptor_set_out=" + protobuf.TempPath); |
||||||
|
//build the MyMessageList proto-buffer and generate code by including MyMessage.pb |
||||||
|
RunProtoGen(0, proto2.TempPath, protobuf.TempPath); |
||||||
|
Assembly a = RunCsc(0, source1.TempPath, source2.TempPath); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t1 = a.GetType("nunit.simple.MyMessage", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage"); |
||||||
|
//assert that the message type is in the expected namespace |
||||||
|
Type t2 = a.GetType("nunit.simple.MyMessageList", true, true); |
||||||
|
Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage"); |
||||||
|
//assert that we can find the static descriptor type |
||||||
|
a.GetType("nunit.simple.Proto.MyMessage", true, true); |
||||||
|
a.GetType("nunit.simple.Proto.MyMessageList", true, true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithService() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||||
|
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
} |
||||||
|
// test a very simple service. |
||||||
|
service TestService { |
||||||
|
rpc Execute (MyMessage) returns (MyMessage); |
||||||
|
}"))
|
||||||
|
{ |
||||||
|
CopyInGoogleProtoFiles(); |
||||||
|
|
||||||
|
RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "-nest_classes=false"); |
||||||
|
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
|
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the service type is in the expected namespace |
||||||
|
Type t1 = a.GetType("nunit.simple.TestService", true, true); |
||||||
|
Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); |
||||||
|
Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); |
||||||
|
//assert that the Stub subclass type is in the expected namespace |
||||||
|
Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); |
||||||
|
Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); |
||||||
|
Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestProtoFileWithServiceInternal() |
||||||
|
{ |
||||||
|
string test = new StackFrame(false).GetMethod().Name; |
||||||
|
Setup(); |
||||||
|
using (TempFile source = TempFile.Attach(test + ".cs")) |
||||||
|
using (ProtoFile proto = new ProtoFile(test + ".proto", |
||||||
|
@"
|
||||||
|
import ""google/protobuf/csharp_options.proto""; |
||||||
|
option (google.protobuf.csharp_file_options).service_generator_type = GENERIC; |
||||||
|
|
||||||
|
package nunit.simple; |
||||||
|
// Test a very simple message. |
||||||
|
message MyMessage { |
||||||
|
optional string name = 1; |
||||||
|
} |
||||||
|
// test a very simple service. |
||||||
|
service TestService { |
||||||
|
rpc Execute (MyMessage) returns (MyMessage); |
||||||
|
}"))
|
||||||
|
{ |
||||||
|
CopyInGoogleProtoFiles(); |
||||||
|
|
||||||
|
RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "-nest_classes=false", "-public_classes=false"); |
||||||
|
Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length); |
||||||
|
|
||||||
|
Assembly a = RunCsc(0, source.TempPath); |
||||||
|
//assert that the service type is in the expected namespace |
||||||
|
Type t1 = a.GetType("nunit.simple.TestService", true, true); |
||||||
|
Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService"); |
||||||
|
Assert.IsTrue(t1.IsAbstract, "Expect abstract class"); |
||||||
|
//assert that the Stub subclass type is in the expected namespace |
||||||
|
Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true); |
||||||
|
Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService"); |
||||||
|
Assert.IsFalse(t2.IsAbstract, "Expect concrete class"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static void CopyInGoogleProtoFiles() |
||||||
|
{ |
||||||
|
string google = Path.Combine(TempPath, "google\\protobuf"); |
||||||
|
Directory.CreateDirectory(google); |
||||||
|
foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf"))) |
||||||
|
{ |
||||||
|
File.Copy(file, Path.Combine(google, Path.GetFileName(file))); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,101 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||||
|
<PropertyGroup> |
||||||
|
<EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor> |
||||||
|
<EnvironmentTemplate>NET35</EnvironmentTemplate> |
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
||||||
|
<ProductVersion>9.0.30729</ProductVersion> |
||||||
|
<SchemaVersion>2.0</SchemaVersion> |
||||||
|
<ProjectGuid>{C1024C9C-8176-48C3-B547-B9F6DF6B80A6}</ProjectGuid> |
||||||
|
<OutputType>Library</OutputType> |
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||||
|
<RootNamespace>Google.ProtocolBuffers.ProtoGen</RootNamespace> |
||||||
|
<AssemblyName>protoc-gen-cs.Test</AssemblyName> |
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
||||||
|
<FileAlignment>512</FileAlignment> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
||||||
|
<DebugSymbols>true</DebugSymbols> |
||||||
|
<DebugType>full</DebugType> |
||||||
|
<Optimize>false</Optimize> |
||||||
|
<OutputPath>bin\NET35\Debug</OutputPath> |
||||||
|
<IntermediateOutputPath>obj\NET35\Debug\</IntermediateOutputPath> |
||||||
|
<DefineConstants>DEBUG;TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants> |
||||||
|
<ErrorReport>prompt</ErrorReport> |
||||||
|
<WarningLevel>4</WarningLevel> |
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors> |
||||||
|
<NoStdLib>true</NoStdLib> |
||||||
|
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> |
||||||
|
</PropertyGroup> |
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> |
||||||
|
<DebugType>pdbonly</DebugType> |
||||||
|
<Optimize>true</Optimize> |
||||||
|
<OutputPath>bin\NET35\Release</OutputPath> |
||||||
|
<IntermediateOutputPath>obj\NET35\Release\</IntermediateOutputPath> |
||||||
|
<DefineConstants>TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants> |
||||||
|
<ErrorReport>prompt</ErrorReport> |
||||||
|
<WarningLevel>4</WarningLevel> |
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors> |
||||||
|
<NoStdLib>true</NoStdLib> |
||||||
|
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> |
||||||
|
</PropertyGroup> |
||||||
|
<ItemGroup> |
||||||
|
<Reference Include="nunit.framework"> |
||||||
|
<SpecificVersion>False</SpecificVersion> |
||||||
|
<HintPath>..\..\lib\NUnit\lib\nunit.framework.dll</HintPath> |
||||||
|
</Reference> |
||||||
|
<Reference Include="mscorlib" /> |
||||||
|
<Reference Include="System" /> |
||||||
|
<Reference Include="System.Data" /> |
||||||
|
<Reference Include="System.Xml" /> |
||||||
|
</ItemGroup> |
||||||
|
<ItemGroup> |
||||||
|
<Compile Include="ProtocGenCsUnittests.cs" /> |
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" /> |
||||||
|
<Compile Include="TempFile.cs" /> |
||||||
|
</ItemGroup> |
||||||
|
<ItemGroup> |
||||||
|
<ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj"> |
||||||
|
<Project>{6908bdce-d925-43f3-94ac-a531e6df2591}</Project> |
||||||
|
<Name>ProtocolBuffers</Name> |
||||||
|
</ProjectReference> |
||||||
|
<ProjectReference Include="..\ProtoGen\protoc-gen-cs.csproj"> |
||||||
|
<Project>{250ade34-82fd-4bae-86d5-985fbe589c4b}</Project> |
||||||
|
<Name>protoc-gen-cs</Name> |
||||||
|
</ProjectReference> |
||||||
|
</ItemGroup> |
||||||
|
<ItemGroup> |
||||||
|
<Content Include="..\..\lib\protoc.exe"> |
||||||
|
<Link>protoc.exe</Link> |
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |
||||||
|
</Content> |
||||||
|
</ItemGroup> |
||||||
|
<ItemGroup> |
||||||
|
<None Include="..\..\protos\google\protobuf\csharp_options.proto"> |
||||||
|
<Link>google\protobuf\csharp_options.proto</Link> |
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |
||||||
|
</None> |
||||||
|
<None Include="..\..\protos\google\protobuf\descriptor.proto"> |
||||||
|
<Link>google\protobuf\descriptor.proto</Link> |
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |
||||||
|
</None> |
||||||
|
</ItemGroup> |
||||||
|
<ItemGroup> |
||||||
|
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> |
||||||
|
</ItemGroup> |
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
||||||
|
<!-- 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> |
||||||
|
--> |
||||||
|
<PropertyGroup> |
||||||
|
<StartAction>Program</StartAction> |
||||||
|
<StartProgram>$(ProjectDir)..\..\lib\NUnit\tools\nunit-console.exe</StartProgram> |
||||||
|
<StartArguments>/nologo /noshadow /labels /wait $(AssemblyName).dll</StartArguments> |
||||||
|
<StartWorkingDirectory>$(ProjectDir)$(OutputPath)</StartWorkingDirectory> |
||||||
|
</PropertyGroup> |
||||||
|
</Project> |
@ -0,0 +1,55 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// Exception thrown when dependencies within a descriptor set can't be resolved. |
||||||
|
/// </summary> |
||||||
|
public sealed class DependencyResolutionException : Exception |
||||||
|
{ |
||||||
|
public DependencyResolutionException(string message) : base(message) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public DependencyResolutionException(string format, params object[] args) |
||||||
|
: base(string.Format(format, args)) |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,106 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System; |
||||||
|
using Google.ProtocolBuffers.DescriptorProtos; |
||||||
|
using Google.ProtocolBuffers.Descriptors; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// Utility class for determining namespaces etc. |
||||||
|
/// </summary> |
||||||
|
internal static class DescriptorUtil |
||||||
|
{ |
||||||
|
internal static string GetFullUmbrellaClassName(IDescriptor descriptor) |
||||||
|
{ |
||||||
|
CSharpFileOptions options = descriptor.File.CSharpOptions; |
||||||
|
string result = options.Namespace; |
||||||
|
if (result != "") |
||||||
|
{ |
||||||
|
result += '.'; |
||||||
|
} |
||||||
|
result += GetQualifiedUmbrellaClassName(options); |
||||||
|
return "global::" + result; |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Evaluates the options and returns the qualified name of the umbrella class |
||||||
|
/// relative to the descriptor type's namespace. Basically concatenates the |
||||||
|
/// UmbrellaNamespace + UmbrellaClassname fields. |
||||||
|
/// </summary> |
||||||
|
internal static string GetQualifiedUmbrellaClassName(CSharpFileOptions options) |
||||||
|
{ |
||||||
|
string fullName = options.UmbrellaClassname; |
||||||
|
if (!options.NestClasses && options.UmbrellaNamespace != "") |
||||||
|
{ |
||||||
|
fullName = String.Format("{0}.{1}", options.UmbrellaNamespace, options.UmbrellaClassname); |
||||||
|
} |
||||||
|
return fullName; |
||||||
|
} |
||||||
|
|
||||||
|
internal static string GetMappedTypeName(MappedType type) |
||||||
|
{ |
||||||
|
switch (type) |
||||||
|
{ |
||||||
|
case MappedType.Int32: |
||||||
|
return "int"; |
||||||
|
case MappedType.Int64: |
||||||
|
return "long"; |
||||||
|
case MappedType.UInt32: |
||||||
|
return "uint"; |
||||||
|
case MappedType.UInt64: |
||||||
|
return "ulong"; |
||||||
|
case MappedType.Single: |
||||||
|
return "float"; |
||||||
|
case MappedType.Double: |
||||||
|
return "double"; |
||||||
|
case MappedType.Boolean: |
||||||
|
return "bool"; |
||||||
|
case MappedType.String: |
||||||
|
return "string"; |
||||||
|
case MappedType.ByteString: |
||||||
|
return "pb::ByteString"; |
||||||
|
case MappedType.Enum: |
||||||
|
return null; |
||||||
|
case MappedType.Message: |
||||||
|
return null; |
||||||
|
default: |
||||||
|
throw new ArgumentOutOfRangeException("Unknown mapped type " + type); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,148 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using Google.ProtocolBuffers.Descriptors; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
internal class EnumFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator |
||||||
|
{ |
||||||
|
internal EnumFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal) |
||||||
|
: base(descriptor, fieldOrdinal) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public void GenerateMembers(TextGenerator writer) |
||||||
|
{ |
||||||
|
writer.WriteLine("private bool has{0};", PropertyName); |
||||||
|
writer.WriteLine("private {0} {1}_ = {2};", TypeName, Name, DefaultValue); |
||||||
|
AddDeprecatedFlag(writer); |
||||||
|
writer.WriteLine("public bool Has{0} {{", PropertyName); |
||||||
|
writer.WriteLine(" get {{ return has{0}; }}", PropertyName); |
||||||
|
writer.WriteLine("}"); |
||||||
|
AddPublicMemberAttributes(writer); |
||||||
|
writer.WriteLine("public {0} {1} {{", TypeName, PropertyName); |
||||||
|
writer.WriteLine(" get {{ return {0}_; }}", Name); |
||||||
|
writer.WriteLine("}"); |
||||||
|
} |
||||||
|
|
||||||
|
public void GenerateBuilderMembers(TextGenerator writer) |
||||||
|
{ |
||||||
|
AddDeprecatedFlag(writer); |
||||||
|
writer.WriteLine("public bool Has{0} {{", PropertyName); |
||||||
|
writer.WriteLine(" get {{ return result.has{0}; }}", PropertyName); |
||||||
|
writer.WriteLine("}"); |
||||||
|
AddPublicMemberAttributes(writer); |
||||||
|
writer.WriteLine("public {0} {1} {{", TypeName, PropertyName); |
||||||
|
writer.WriteLine(" get {{ return result.{0}; }}", PropertyName); |
||||||
|
writer.WriteLine(" set {{ Set{0}(value); }}", PropertyName); |
||||||
|
writer.WriteLine("}"); |
||||||
|
AddPublicMemberAttributes(writer); |
||||||
|
writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName); |
||||||
|
writer.WriteLine(" PrepareBuilder();"); |
||||||
|
writer.WriteLine(" result.has{0} = true;", PropertyName); |
||||||
|
writer.WriteLine(" result.{0}_ = value;", Name); |
||||||
|
writer.WriteLine(" return this;"); |
||||||
|
writer.WriteLine("}"); |
||||||
|
AddDeprecatedFlag(writer); |
||||||
|
writer.WriteLine("public Builder Clear{0}() {{", PropertyName); |
||||||
|
writer.WriteLine(" PrepareBuilder();"); |
||||||
|
writer.WriteLine(" result.has{0} = false;", PropertyName); |
||||||
|
writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue); |
||||||
|
writer.WriteLine(" return this;"); |
||||||
|
writer.WriteLine("}"); |
||||||
|
} |
||||||
|
|
||||||
|
public void GenerateMergingCode(TextGenerator writer) |
||||||
|
{ |
||||||
|
writer.WriteLine("if (other.Has{0}) {{", PropertyName); |
||||||
|
writer.WriteLine(" {0} = other.{0};", PropertyName); |
||||||
|
writer.WriteLine("}"); |
||||||
|
} |
||||||
|
|
||||||
|
public void GenerateBuildingCode(TextGenerator writer) |
||||||
|
{ |
||||||
|
// Nothing to do here for enum types |
||||||
|
} |
||||||
|
|
||||||
|
public void GenerateParsingCode(TextGenerator writer) |
||||||
|
{ |
||||||
|
writer.WriteLine("object unknown;"); |
||||||
|
writer.WriteLine("if(input.ReadEnum(ref result.{0}_, out unknown)) {{", Name); |
||||||
|
writer.WriteLine(" result.has{0} = true;", PropertyName); |
||||||
|
writer.WriteLine("} else if(unknown is int) {"); |
||||||
|
if (!UseLiteRuntime) |
||||||
|
{ |
||||||
|
writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now |
||||||
|
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); |
||||||
|
writer.WriteLine(" }"); |
||||||
|
writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong)(int)unknown);", Number); |
||||||
|
} |
||||||
|
writer.WriteLine("}"); |
||||||
|
} |
||||||
|
|
||||||
|
public void GenerateSerializationCode(TextGenerator writer) |
||||||
|
{ |
||||||
|
writer.WriteLine("if (has{0}) {{", PropertyName); |
||||||
|
writer.WriteLine(" output.WriteEnum({0}, field_names[{2}], (int) {1}, {1});", Number, PropertyName, |
||||||
|
FieldOrdinal); |
||||||
|
writer.WriteLine("}"); |
||||||
|
} |
||||||
|
|
||||||
|
public void GenerateSerializedSizeCode(TextGenerator writer) |
||||||
|
{ |
||||||
|
writer.WriteLine("if (has{0}) {{", PropertyName); |
||||||
|
writer.WriteLine(" size += pb::CodedOutputStream.ComputeEnumSize({0}, (int) {1});", Number, PropertyName); |
||||||
|
writer.WriteLine("}"); |
||||||
|
} |
||||||
|
|
||||||
|
public override void WriteHash(TextGenerator writer) |
||||||
|
{ |
||||||
|
writer.WriteLine("if (has{0}) hash ^= {1}_.GetHashCode();", PropertyName, Name); |
||||||
|
} |
||||||
|
|
||||||
|
public override void WriteEquals(TextGenerator writer) |
||||||
|
{ |
||||||
|
writer.WriteLine("if (has{0} != other.has{0} || (has{0} && !{1}_.Equals(other.{1}_))) return false;", |
||||||
|
PropertyName, Name); |
||||||
|
} |
||||||
|
|
||||||
|
public override void WriteToString(TextGenerator writer) |
||||||
|
{ |
||||||
|
writer.WriteLine("PrintField(\"{0}\", has{1}, {2}_, writer);", Descriptor.Name, PropertyName, Name); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using Google.ProtocolBuffers.Descriptors; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
internal class EnumGenerator : SourceGeneratorBase<EnumDescriptor>, ISourceGenerator |
||||||
|
{ |
||||||
|
internal EnumGenerator(EnumDescriptor descriptor) : base(descriptor) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
// TODO(jonskeet): Write out enum descriptors? Can be retrieved from file... |
||||||
|
public void Generate(TextGenerator writer) |
||||||
|
{ |
||||||
|
WriteGeneratedCodeAttributes(writer); |
||||||
|
writer.WriteLine("{0} enum {1} {{", ClassAccessLevel, Descriptor.Name); |
||||||
|
writer.Indent(); |
||||||
|
foreach (EnumValueDescriptor value in Descriptor.Values) |
||||||
|
{ |
||||||
|
writer.WriteLine("{0} = {1},", value.Name, value.Number); |
||||||
|
} |
||||||
|
writer.Outdent(); |
||||||
|
writer.WriteLine("}"); |
||||||
|
writer.WriteLine(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,183 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System; |
||||||
|
using Google.ProtocolBuffers.Descriptors; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
internal class ExtensionGenerator : FieldGeneratorBase, ISourceGenerator |
||||||
|
{ |
||||||
|
private readonly string extends; |
||||||
|
private readonly string scope; |
||||||
|
private readonly string type; |
||||||
|
private readonly string name; |
||||||
|
|
||||||
|
internal ExtensionGenerator(FieldDescriptor descriptor) |
||||||
|
: base(descriptor, 0) |
||||||
|
{ |
||||||
|
if (Descriptor.ExtensionScope != null) |
||||||
|
{ |
||||||
|
scope = GetClassName(Descriptor.ExtensionScope); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
scope = DescriptorUtil.GetFullUmbrellaClassName(Descriptor.File); |
||||||
|
} |
||||||
|
switch (Descriptor.MappedType) |
||||||
|
{ |
||||||
|
case MappedType.Message: |
||||||
|
type = GetClassName(Descriptor.MessageType); |
||||||
|
break; |
||||||
|
case MappedType.Enum: |
||||||
|
type = GetClassName(Descriptor.EnumType); |
||||||
|
break; |
||||||
|
default: |
||||||
|
type = DescriptorUtil.GetMappedTypeName(Descriptor.MappedType); |
||||||
|
break; |
||||||
|
} |
||||||
|
extends = GetClassName(Descriptor.ContainingType); |
||||||
|
name = Descriptor.CSharpOptions.PropertyName; |
||||||
|
} |
||||||
|
|
||||||
|
public void Generate(TextGenerator writer) |
||||||
|
{ |
||||||
|
if (Descriptor.File.CSharpOptions.ClsCompliance && GetFieldConstantName(Descriptor).StartsWith("_")) |
||||||
|
{ |
||||||
|
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||||
|
} |
||||||
|
|
||||||
|
writer.WriteLine("public const int {0} = {1};", GetFieldConstantName(Descriptor), Descriptor.FieldNumber); |
||||||
|
|
||||||
|
if (UseLiteRuntime) |
||||||
|
{ |
||||||
|
if (Descriptor.MappedType == MappedType.Message && Descriptor.MessageType.Options.MessageSetWireFormat) |
||||||
|
{ |
||||||
|
throw new ArgumentException( |
||||||
|
"option message_set_wire_format = true; is not supported in Lite runtime extensions."); |
||||||
|
} |
||||||
|
if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance) |
||||||
|
{ |
||||||
|
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||||
|
} |
||||||
|
writer.WriteLine("{0} static pb::{4}<{1}, {2}> {3};", ClassAccessLevel, extends, type, name, |
||||||
|
Descriptor.IsRepeated ? "GeneratedRepeatExtensionLite" : "GeneratedExtensionLite"); |
||||||
|
} |
||||||
|
else if (Descriptor.IsRepeated) |
||||||
|
{ |
||||||
|
if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance) |
||||||
|
{ |
||||||
|
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||||
|
} |
||||||
|
writer.WriteLine("{0} static pb::GeneratedExtensionBase<scg::IList<{1}>> {2};", ClassAccessLevel, type, |
||||||
|
name); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance) |
||||||
|
{ |
||||||
|
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||||
|
} |
||||||
|
writer.WriteLine("{0} static pb::GeneratedExtensionBase<{1}> {2};", ClassAccessLevel, type, name); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
internal void GenerateStaticVariableInitializers(TextGenerator writer) |
||||||
|
{ |
||||||
|
if (UseLiteRuntime) |
||||||
|
{ |
||||||
|
writer.WriteLine("{0}.{1} = ", scope, name); |
||||||
|
writer.Indent(); |
||||||
|
writer.WriteLine("new pb::{0}<{1}, {2}>(", |
||||||
|
Descriptor.IsRepeated ? "GeneratedRepeatExtensionLite" : "GeneratedExtensionLite", |
||||||
|
extends, type); |
||||||
|
writer.Indent(); |
||||||
|
writer.WriteLine("\"{0}\",", Descriptor.FullName); |
||||||
|
writer.WriteLine("{0}.DefaultInstance,", extends); |
||||||
|
if (!Descriptor.IsRepeated) |
||||||
|
{ |
||||||
|
writer.WriteLine("{0},", |
||||||
|
Descriptor.HasDefaultValue |
||||||
|
? DefaultValue |
||||||
|
: IsNullableType ? "null" : "default(" + type + ")"); |
||||||
|
} |
||||||
|
writer.WriteLine("{0},", |
||||||
|
(Descriptor.MappedType == MappedType.Message) ? type + ".DefaultInstance" : "null"); |
||||||
|
writer.WriteLine("{0},", |
||||||
|
(Descriptor.MappedType == MappedType.Enum) ? "new EnumLiteMap<" + type + ">()" : "null"); |
||||||
|
writer.WriteLine("{0}.{1}FieldNumber,", scope, name); |
||||||
|
writer.Write("pbd::FieldType.{0}", Descriptor.FieldType); |
||||||
|
if (Descriptor.IsRepeated) |
||||||
|
{ |
||||||
|
writer.WriteLine(","); |
||||||
|
writer.Write(Descriptor.IsPacked ? "true" : "false"); |
||||||
|
} |
||||||
|
writer.Outdent(); |
||||||
|
writer.WriteLine(");"); |
||||||
|
writer.Outdent(); |
||||||
|
} |
||||||
|
else if (Descriptor.IsRepeated) |
||||||
|
{ |
||||||
|
writer.WriteLine( |
||||||
|
"{0}.{1} = pb::GeneratedRepeatExtension<{2}>.CreateInstance({0}.Descriptor.Extensions[{3}]);", scope, |
||||||
|
name, type, Descriptor.Index); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
writer.WriteLine( |
||||||
|
"{0}.{1} = pb::GeneratedSingleExtension<{2}>.CreateInstance({0}.Descriptor.Extensions[{3}]);", scope, |
||||||
|
name, type, Descriptor.Index); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
internal void GenerateExtensionRegistrationCode(TextGenerator writer) |
||||||
|
{ |
||||||
|
writer.WriteLine("registry.Add({0}.{1});", scope, name); |
||||||
|
} |
||||||
|
|
||||||
|
public override void WriteHash(TextGenerator writer) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public override void WriteEquals(TextGenerator writer) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public override void WriteToString(TextGenerator writer) |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,389 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Globalization; |
||||||
|
using System.Text; |
||||||
|
using Google.ProtocolBuffers.Descriptors; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
internal abstract class FieldGeneratorBase : SourceGeneratorBase<FieldDescriptor> |
||||||
|
{ |
||||||
|
private readonly int _fieldOrdinal; |
||||||
|
|
||||||
|
protected FieldGeneratorBase(FieldDescriptor descriptor, int fieldOrdinal) |
||||||
|
: base(descriptor) |
||||||
|
{ |
||||||
|
_fieldOrdinal = fieldOrdinal; |
||||||
|
} |
||||||
|
|
||||||
|
public abstract void WriteHash(TextGenerator writer); |
||||||
|
public abstract void WriteEquals(TextGenerator writer); |
||||||
|
public abstract void WriteToString(TextGenerator writer); |
||||||
|
|
||||||
|
public int FieldOrdinal |
||||||
|
{ |
||||||
|
get { return _fieldOrdinal; } |
||||||
|
} |
||||||
|
|
||||||
|
private static bool AllPrintableAscii(string text) |
||||||
|
{ |
||||||
|
foreach (char c in text) |
||||||
|
{ |
||||||
|
if (c < 0x20 || c > 0x7e) |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// This returns true if the field has a non-default default value. For instance this returns |
||||||
|
/// false for numerics with a default of zero '0', or booleans with a default of false. |
||||||
|
/// </summary> |
||||||
|
protected bool HasDefaultValue |
||||||
|
{ |
||||||
|
get |
||||||
|
{ |
||||||
|
switch (Descriptor.FieldType) |
||||||
|
{ |
||||||
|
case FieldType.Float: |
||||||
|
case FieldType.Double: |
||||||
|
case FieldType.Int32: |
||||||
|
case FieldType.Int64: |
||||||
|
case FieldType.SInt32: |
||||||
|
case FieldType.SInt64: |
||||||
|
case FieldType.SFixed32: |
||||||
|
case FieldType.SFixed64: |
||||||
|
case FieldType.UInt32: |
||||||
|
case FieldType.UInt64: |
||||||
|
case FieldType.Fixed32: |
||||||
|
case FieldType.Fixed64: |
||||||
|
{ |
||||||
|
IConvertible value = (IConvertible) Descriptor.DefaultValue; |
||||||
|
return value.ToString(CultureInfo.InvariantCulture) != "0"; |
||||||
|
} |
||||||
|
case FieldType.Bool: |
||||||
|
return ((bool) Descriptor.DefaultValue) == true; |
||||||
|
default: |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// <remarks>Copy exists in ExtensionGenerator.cs</remarks> |
||||||
|
protected string DefaultValue |
||||||
|
{ |
||||||
|
get |
||||||
|
{ |
||||||
|
string suffix = ""; |
||||||
|
switch (Descriptor.FieldType) |
||||||
|
{ |
||||||
|
case FieldType.Float: |
||||||
|
suffix = "F"; |
||||||
|
break; |
||||||
|
case FieldType.Double: |
||||||
|
suffix = "D"; |
||||||
|
break; |
||||||
|
case FieldType.Int64: |
||||||
|
suffix = "L"; |
||||||
|
break; |
||||||
|
case FieldType.UInt64: |
||||||
|
suffix = "UL"; |
||||||
|
break; |
||||||
|
} |
||||||
|
switch (Descriptor.FieldType) |
||||||
|
{ |
||||||
|
case FieldType.Float: |
||||||
|
case FieldType.Double: |
||||||
|
case FieldType.Int32: |
||||||
|
case FieldType.Int64: |
||||||
|
case FieldType.SInt32: |
||||||
|
case FieldType.SInt64: |
||||||
|
case FieldType.SFixed32: |
||||||
|
case FieldType.SFixed64: |
||||||
|
case FieldType.UInt32: |
||||||
|
case FieldType.UInt64: |
||||||
|
case FieldType.Fixed32: |
||||||
|
case FieldType.Fixed64: |
||||||
|
{ |
||||||
|
// The simple Object.ToString converts using the current culture. |
||||||
|
// We want to always use the invariant culture so it's predictable. |
||||||
|
IConvertible value = (IConvertible) Descriptor.DefaultValue; |
||||||
|
//a few things that must be handled explicitly |
||||||
|
if (Descriptor.FieldType == FieldType.Double && value is double) |
||||||
|
{ |
||||||
|
if (double.IsNaN((double) value)) |
||||||
|
{ |
||||||
|
return "double.NaN"; |
||||||
|
} |
||||||
|
if (double.IsPositiveInfinity((double) value)) |
||||||
|
{ |
||||||
|
return "double.PositiveInfinity"; |
||||||
|
} |
||||||
|
if (double.IsNegativeInfinity((double) value)) |
||||||
|
{ |
||||||
|
return "double.NegativeInfinity"; |
||||||
|
} |
||||||
|
} |
||||||
|
else if (Descriptor.FieldType == FieldType.Float && value is float) |
||||||
|
{ |
||||||
|
if (float.IsNaN((float) value)) |
||||||
|
{ |
||||||
|
return "float.NaN"; |
||||||
|
} |
||||||
|
if (float.IsPositiveInfinity((float) value)) |
||||||
|
{ |
||||||
|
return "float.PositiveInfinity"; |
||||||
|
} |
||||||
|
if (float.IsNegativeInfinity((float) value)) |
||||||
|
{ |
||||||
|
return "float.NegativeInfinity"; |
||||||
|
} |
||||||
|
} |
||||||
|
return value.ToString(CultureInfo.InvariantCulture) + suffix; |
||||||
|
} |
||||||
|
case FieldType.Bool: |
||||||
|
return (bool) Descriptor.DefaultValue ? "true" : "false"; |
||||||
|
|
||||||
|
case FieldType.Bytes: |
||||||
|
if (!Descriptor.HasDefaultValue) |
||||||
|
{ |
||||||
|
return "pb::ByteString.Empty"; |
||||||
|
} |
||||||
|
if (UseLiteRuntime && Descriptor.DefaultValue is ByteString) |
||||||
|
{ |
||||||
|
string temp = (((ByteString) Descriptor.DefaultValue).ToBase64()); |
||||||
|
return String.Format("pb::ByteString.FromBase64(\"{0}\")", temp); |
||||||
|
} |
||||||
|
return string.Format("(pb::ByteString) {0}.Descriptor.Fields[{1}].DefaultValue", |
||||||
|
GetClassName(Descriptor.ContainingType), Descriptor.Index); |
||||||
|
case FieldType.String: |
||||||
|
if (AllPrintableAscii(Descriptor.Proto.DefaultValue)) |
||||||
|
{ |
||||||
|
// All chars are ASCII and printable. In this case we only |
||||||
|
// need to escape quotes and backslashes. |
||||||
|
return "\"" + Descriptor.Proto.DefaultValue |
||||||
|
.Replace("\\", "\\\\") |
||||||
|
.Replace("'", "\\'") |
||||||
|
.Replace("\"", "\\\"") |
||||||
|
+ "\""; |
||||||
|
} |
||||||
|
if (UseLiteRuntime && Descriptor.DefaultValue is String) |
||||||
|
{ |
||||||
|
string temp = Convert.ToBase64String( |
||||||
|
Encoding.UTF8.GetBytes((String) Descriptor.DefaultValue)); |
||||||
|
return String.Format("pb::ByteString.FromBase64(\"{0}\").ToStringUtf8()", temp); |
||||||
|
} |
||||||
|
return string.Format("(string) {0}.Descriptor.Fields[{1}].DefaultValue", |
||||||
|
GetClassName(Descriptor.ContainingType), Descriptor.Index); |
||||||
|
case FieldType.Enum: |
||||||
|
return TypeName + "." + ((EnumValueDescriptor) Descriptor.DefaultValue).Name; |
||||||
|
case FieldType.Message: |
||||||
|
case FieldType.Group: |
||||||
|
return TypeName + ".DefaultInstance"; |
||||||
|
default: |
||||||
|
throw new InvalidOperationException("Invalid field descriptor type"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected string PropertyName |
||||||
|
{ |
||||||
|
get { return Descriptor.CSharpOptions.PropertyName; } |
||||||
|
} |
||||||
|
|
||||||
|
protected string Name |
||||||
|
{ |
||||||
|
get { return NameHelpers.UnderscoresToCamelCase(GetFieldName(Descriptor)); } |
||||||
|
} |
||||||
|
|
||||||
|
protected int Number |
||||||
|
{ |
||||||
|
get { return Descriptor.FieldNumber; } |
||||||
|
} |
||||||
|
|
||||||
|
protected void AddNullCheck(TextGenerator writer) |
||||||
|
{ |
||||||
|
AddNullCheck(writer, "value"); |
||||||
|
} |
||||||
|
|
||||||
|
protected void AddNullCheck(TextGenerator writer, string name) |
||||||
|
{ |
||||||
|
if (IsNullableType) |
||||||
|
{ |
||||||
|
writer.WriteLine(" pb::ThrowHelper.ThrowIfNull({0}, \"{0}\");", name); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected void AddPublicMemberAttributes(TextGenerator writer) |
||||||
|
{ |
||||||
|
AddDeprecatedFlag(writer); |
||||||
|
AddClsComplianceCheck(writer); |
||||||
|
} |
||||||
|
|
||||||
|
protected void AddClsComplianceCheck(TextGenerator writer) |
||||||
|
{ |
||||||
|
if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance) |
||||||
|
{ |
||||||
|
writer.WriteLine("[global::System.CLSCompliant(false)]"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected bool IsObsolete { get { return Descriptor.Options.Deprecated; } } |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Writes [global::System.ObsoleteAttribute()] if the member is obsolete |
||||||
|
/// </summary> |
||||||
|
protected void AddDeprecatedFlag(TextGenerator writer) |
||||||
|
{ |
||||||
|
if (IsObsolete) |
||||||
|
{ |
||||||
|
writer.WriteLine("[global::System.ObsoleteAttribute()]"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// For encodings with fixed sizes, returns that size in bytes. Otherwise |
||||||
|
/// returns -1. TODO(jonskeet): Make this less ugly. |
||||||
|
/// </summary> |
||||||
|
protected int FixedSize |
||||||
|
{ |
||||||
|
get |
||||||
|
{ |
||||||
|
switch (Descriptor.FieldType) |
||||||
|
{ |
||||||
|
case FieldType.UInt32: |
||||||
|
case FieldType.UInt64: |
||||||
|
case FieldType.Int32: |
||||||
|
case FieldType.Int64: |
||||||
|
case FieldType.SInt32: |
||||||
|
case FieldType.SInt64: |
||||||
|
case FieldType.Enum: |
||||||
|
case FieldType.Bytes: |
||||||
|
case FieldType.String: |
||||||
|
case FieldType.Message: |
||||||
|
case FieldType.Group: |
||||||
|
return -1; |
||||||
|
case FieldType.Float: |
||||||
|
return WireFormat.FloatSize; |
||||||
|
case FieldType.SFixed32: |
||||||
|
return WireFormat.SFixed32Size; |
||||||
|
case FieldType.Fixed32: |
||||||
|
return WireFormat.Fixed32Size; |
||||||
|
case FieldType.Double: |
||||||
|
return WireFormat.DoubleSize; |
||||||
|
case FieldType.SFixed64: |
||||||
|
return WireFormat.SFixed64Size; |
||||||
|
case FieldType.Fixed64: |
||||||
|
return WireFormat.Fixed64Size; |
||||||
|
case FieldType.Bool: |
||||||
|
return WireFormat.BoolSize; |
||||||
|
default: |
||||||
|
throw new InvalidOperationException("Invalid field descriptor type"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected bool IsNullableType |
||||||
|
{ |
||||||
|
get |
||||||
|
{ |
||||||
|
switch (Descriptor.FieldType) |
||||||
|
{ |
||||||
|
case FieldType.Float: |
||||||
|
case FieldType.Double: |
||||||
|
case FieldType.Int32: |
||||||
|
case FieldType.Int64: |
||||||
|
case FieldType.SInt32: |
||||||
|
case FieldType.SInt64: |
||||||
|
case FieldType.SFixed32: |
||||||
|
case FieldType.SFixed64: |
||||||
|
case FieldType.UInt32: |
||||||
|
case FieldType.UInt64: |
||||||
|
case FieldType.Fixed32: |
||||||
|
case FieldType.Fixed64: |
||||||
|
case FieldType.Bool: |
||||||
|
case FieldType.Enum: |
||||||
|
return false; |
||||||
|
case FieldType.Bytes: |
||||||
|
case FieldType.String: |
||||||
|
case FieldType.Message: |
||||||
|
case FieldType.Group: |
||||||
|
return true; |
||||||
|
default: |
||||||
|
throw new InvalidOperationException("Invalid field descriptor type"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected string TypeName |
||||||
|
{ |
||||||
|
get |
||||||
|
{ |
||||||
|
switch (Descriptor.FieldType) |
||||||
|
{ |
||||||
|
case FieldType.Enum: |
||||||
|
return GetClassName(Descriptor.EnumType); |
||||||
|
case FieldType.Message: |
||||||
|
case FieldType.Group: |
||||||
|
return GetClassName(Descriptor.MessageType); |
||||||
|
default: |
||||||
|
return DescriptorUtil.GetMappedTypeName(Descriptor.MappedType); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected string MessageOrGroup |
||||||
|
{ |
||||||
|
get { return Descriptor.FieldType == FieldType.Group ? "Group" : "Message"; } |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Returns the type name as used in CodedInputStream method names: SFixed32, UInt32 etc. |
||||||
|
/// </summary> |
||||||
|
protected string CapitalizedTypeName |
||||||
|
{ |
||||||
|
get |
||||||
|
{ |
||||||
|
// Our enum names match perfectly. How serendipitous. |
||||||
|
return Descriptor.FieldType.ToString(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,267 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.IO; |
||||||
|
using System.Text; |
||||||
|
using Google.ProtocolBuffers.Collections; |
||||||
|
using Google.ProtocolBuffers.Compiler.PluginProto; |
||||||
|
using Google.ProtocolBuffers.DescriptorProtos; |
||||||
|
using Google.ProtocolBuffers.Descriptors; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// Code generator for protocol buffers. Only C# is supported at the moment. |
||||||
|
/// </summary> |
||||||
|
public sealed class Generator |
||||||
|
{ |
||||||
|
private readonly GeneratorOptions options; |
||||||
|
|
||||||
|
private Generator(GeneratorOptions options) |
||||||
|
{ |
||||||
|
options.Validate(); |
||||||
|
this.options = options; |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Returns a generator configured with the specified options. |
||||||
|
/// </summary> |
||||||
|
public static Generator CreateGenerator(GeneratorOptions options) |
||||||
|
{ |
||||||
|
return new Generator(options); |
||||||
|
} |
||||||
|
|
||||||
|
public void Generate(CodeGeneratorRequest request, CodeGeneratorResponse.Builder response) |
||||||
|
{ |
||||||
|
IList<FileDescriptor> descriptors = ConvertDescriptors(options.FileOptions, request.ProtoFileList); |
||||||
|
|
||||||
|
// Combine with options from command line |
||||||
|
foreach (FileDescriptor descriptor in descriptors) |
||||||
|
{ |
||||||
|
descriptor.ConfigureWithDefaultOptions(options.FileOptions); |
||||||
|
} |
||||||
|
|
||||||
|
bool duplicates = false; |
||||||
|
Dictionary<string, bool> names = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase); |
||||||
|
foreach (FileDescriptor descriptor in descriptors) |
||||||
|
{ |
||||||
|
string file = GetOutputFile(descriptor, false); |
||||||
|
if (names.ContainsKey(file)) |
||||||
|
{ |
||||||
|
duplicates = true; |
||||||
|
break; |
||||||
|
} |
||||||
|
names.Add(file, true); |
||||||
|
} |
||||||
|
|
||||||
|
//ROK - Changed to dictionary from HashSet to allow 2.0 compile |
||||||
|
var filesToGenerate = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); |
||||||
|
foreach (var item in request.FileToGenerateList) |
||||||
|
{ |
||||||
|
filesToGenerate[item] = null; |
||||||
|
} |
||||||
|
foreach (FileDescriptor descriptor in descriptors) |
||||||
|
{ |
||||||
|
// Optionally exclude descriptors in google.protobuf |
||||||
|
if (descriptor.CSharpOptions.IgnoreGoogleProtobuf && descriptor.Package == "google.protobuf") |
||||||
|
{ |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (filesToGenerate.ContainsKey(descriptor.Name)) |
||||||
|
{ |
||||||
|
Generate(descriptor, duplicates, response); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Generates code for a particular file. All dependencies must |
||||||
|
/// already have been resolved. |
||||||
|
/// </summary> |
||||||
|
private void Generate(FileDescriptor descriptor, bool duplicates, CodeGeneratorResponse.Builder response) |
||||||
|
{ |
||||||
|
var code = new StringBuilder(); |
||||||
|
var ucg = new UmbrellaClassGenerator(descriptor); |
||||||
|
using (StringWriter textWriter = new StringWriter(code)) |
||||||
|
{ |
||||||
|
TextGenerator writer = new TextGenerator(textWriter, options.LineBreak); |
||||||
|
ucg.Generate(writer); |
||||||
|
} |
||||||
|
response.AddFile(new CodeGeneratorResponse.Types.File.Builder |
||||||
|
{ |
||||||
|
Name = GetOutputFile(descriptor, duplicates), |
||||||
|
Content = code.ToString(), |
||||||
|
}.Build()); |
||||||
|
} |
||||||
|
|
||||||
|
private string GetOutputFile(FileDescriptor descriptor, bool duplicates) |
||||||
|
{ |
||||||
|
CSharpFileOptions fileOptions = descriptor.CSharpOptions; |
||||||
|
|
||||||
|
string filename = descriptor.CSharpOptions.UmbrellaClassname + descriptor.CSharpOptions.FileExtension; |
||||||
|
if (duplicates) |
||||||
|
{ |
||||||
|
string namepart; |
||||||
|
if (String.IsNullOrEmpty(descriptor.Name) || String.IsNullOrEmpty(namepart = Path.GetFileNameWithoutExtension(descriptor.Name))) |
||||||
|
throw new ApplicationException("Duplicate UmbrellaClassname options created a file name collision."); |
||||||
|
|
||||||
|
filename = namepart + descriptor.CSharpOptions.FileExtension; |
||||||
|
} |
||||||
|
|
||||||
|
string outputDirectory = descriptor.CSharpOptions.OutputDirectory; |
||||||
|
if (fileOptions.ExpandNamespaceDirectories) |
||||||
|
{ |
||||||
|
string package = fileOptions.Namespace; |
||||||
|
if (!string.IsNullOrEmpty(package)) |
||||||
|
{ |
||||||
|
string[] bits = package.Split('.'); |
||||||
|
foreach (string bit in bits) |
||||||
|
{ |
||||||
|
outputDirectory = Path.Combine(outputDirectory, bit); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// As the directory can be explicitly specified in options, we need to make sure it exists |
||||||
|
Directory.CreateDirectory(outputDirectory); |
||||||
|
return Path.Combine(outputDirectory, filename); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Resolves any dependencies and converts FileDescriptorProtos into FileDescriptors. |
||||||
|
/// The list returned is in the same order as the protos are listed in the descriptor set. |
||||||
|
/// Note: this method is internal rather than private to allow testing. |
||||||
|
/// </summary> |
||||||
|
/// <exception cref="DependencyResolutionException">Not all dependencies could be resolved.</exception> |
||||||
|
public static IList<FileDescriptor> ConvertDescriptors(CSharpFileOptions options, |
||||||
|
IList<FileDescriptorProto> fileList) |
||||||
|
{ |
||||||
|
FileDescriptor[] converted = new FileDescriptor[fileList.Count]; |
||||||
|
|
||||||
|
Dictionary<string, FileDescriptor> convertedMap = new Dictionary<string, FileDescriptor>(); |
||||||
|
|
||||||
|
int totalConverted = 0; |
||||||
|
|
||||||
|
bool madeProgress = true; |
||||||
|
while (madeProgress && totalConverted < converted.Length) |
||||||
|
{ |
||||||
|
madeProgress = false; |
||||||
|
for (int i = 0; i < converted.Length; i++) |
||||||
|
{ |
||||||
|
if (converted[i] != null) |
||||||
|
{ |
||||||
|
// Already done this one |
||||||
|
continue; |
||||||
|
} |
||||||
|
FileDescriptorProto candidate = fileList[i]; |
||||||
|
FileDescriptor[] dependencies = new FileDescriptor[candidate.DependencyList.Count]; |
||||||
|
|
||||||
|
|
||||||
|
CSharpFileOptions.Builder builder = options.ToBuilder(); |
||||||
|
if (candidate.Options.HasExtension(CSharpOptions.CSharpFileOptions)) |
||||||
|
{ |
||||||
|
builder.MergeFrom( |
||||||
|
candidate.Options.GetExtension(CSharpOptions.CSharpFileOptions)); |
||||||
|
} |
||||||
|
CSharpFileOptions localOptions = builder.Build(); |
||||||
|
|
||||||
|
bool foundAllDependencies = true; |
||||||
|
for (int j = 0; j < dependencies.Length; j++) |
||||||
|
{ |
||||||
|
if (!convertedMap.TryGetValue(candidate.DependencyList[j], out dependencies[j])) |
||||||
|
{ |
||||||
|
// We can auto-magically resolve these since we already have their description |
||||||
|
// This way if the file is only referencing options it does not need to be built with the |
||||||
|
// --include_imports definition. |
||||||
|
if (localOptions.IgnoreGoogleProtobuf && |
||||||
|
(candidate.DependencyList[j] == "google/protobuf/csharp_options.proto")) |
||||||
|
{ |
||||||
|
dependencies[j] = CSharpOptions.Descriptor; |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (localOptions.IgnoreGoogleProtobuf && |
||||||
|
(candidate.DependencyList[j] == "google/protobuf/descriptor.proto")) |
||||||
|
{ |
||||||
|
dependencies[j] = DescriptorProtoFile.Descriptor; |
||||||
|
continue; |
||||||
|
} |
||||||
|
foundAllDependencies = false; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
if (!foundAllDependencies) |
||||||
|
{ |
||||||
|
continue; |
||||||
|
} |
||||||
|
madeProgress = true; |
||||||
|
totalConverted++; |
||||||
|
converted[i] = FileDescriptor.BuildFrom(candidate, dependencies); |
||||||
|
convertedMap[candidate.Name] = converted[i]; |
||||||
|
} |
||||||
|
} |
||||||
|
if (!madeProgress) |
||||||
|
{ |
||||||
|
StringBuilder remaining = new StringBuilder(); |
||||||
|
for (int i = 0; i < converted.Length; i++) |
||||||
|
{ |
||||||
|
if (converted[i] == null) |
||||||
|
{ |
||||||
|
if (remaining.Length != 0) |
||||||
|
{ |
||||||
|
remaining.Append(", "); |
||||||
|
} |
||||||
|
FileDescriptorProto failure = fileList[i]; |
||||||
|
remaining.Append(failure.Name); |
||||||
|
remaining.Append(":"); |
||||||
|
foreach (string dependency in failure.DependencyList) |
||||||
|
{ |
||||||
|
if (!convertedMap.ContainsKey(dependency)) |
||||||
|
{ |
||||||
|
remaining.Append(" "); |
||||||
|
remaining.Append(dependency); |
||||||
|
} |
||||||
|
} |
||||||
|
remaining.Append(";"); |
||||||
|
} |
||||||
|
} |
||||||
|
throw new DependencyResolutionException("Unable to resolve all dependencies: " + remaining); |
||||||
|
} |
||||||
|
return Lists.AsReadOnly(converted); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,330 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.IO; |
||||||
|
using System.Text.RegularExpressions; |
||||||
|
using Google.ProtocolBuffers.DescriptorProtos; |
||||||
|
using Google.ProtocolBuffers.Descriptors; |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// All the configuration required for the generator - where to generate |
||||||
|
/// output files, the location of input files etc. While this isn't immutable |
||||||
|
/// in practice, the contents shouldn't be changed after being passed to |
||||||
|
/// the generator. |
||||||
|
/// </summary> |
||||||
|
public sealed class GeneratorOptions |
||||||
|
{ |
||||||
|
private static Dictionary<string, string> LineBreaks = |
||||||
|
new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) |
||||||
|
{ |
||||||
|
{"Windows", "\r\n"}, |
||||||
|
{"Unix", "\n"}, |
||||||
|
{"Default", Environment.NewLine} |
||||||
|
}; |
||||||
|
|
||||||
|
public IList<string> InputFiles { get; set; } |
||||||
|
|
||||||
|
public GeneratorOptions() |
||||||
|
{ |
||||||
|
LineBreak = Environment.NewLine; |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Attempts to validate the options, but doesn't throw an exception if they're invalid. |
||||||
|
/// Instead, when this method returns false, the output variable will contain a collection |
||||||
|
/// of reasons for the validation failure. |
||||||
|
/// </summary> |
||||||
|
/// <param name="reasons">Variable to receive a list of reasons in case of validation failure.</param> |
||||||
|
/// <returns>true if the options are valid; false otherwise</returns> |
||||||
|
public bool TryValidate(out IList<string> reasons) |
||||||
|
{ |
||||||
|
List<string> tmpReasons = new List<string>(); |
||||||
|
|
||||||
|
ParseArguments(tmpReasons); |
||||||
|
|
||||||
|
// Output directory validation |
||||||
|
if (string.IsNullOrEmpty(FileOptions.OutputDirectory)) |
||||||
|
{ |
||||||
|
tmpReasons.Add("No output directory specified"); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
if (!Directory.Exists(FileOptions.OutputDirectory)) |
||||||
|
{ |
||||||
|
tmpReasons.Add("Specified output directory (" + FileOptions.OutputDirectory + " doesn't exist."); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Input file validation (just in terms of presence) |
||||||
|
if (InputFiles == null || InputFiles.Count == 0) |
||||||
|
{ |
||||||
|
tmpReasons.Add("No input files specified"); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
foreach (string input in InputFiles) |
||||||
|
{ |
||||||
|
FileInfo fi = new FileInfo(input); |
||||||
|
if (!fi.Exists) |
||||||
|
{ |
||||||
|
tmpReasons.Add("Input file " + input + " doesn't exist."); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (tmpReasons.Count != 0) |
||||||
|
{ |
||||||
|
reasons = tmpReasons; |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
reasons = null; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Validates that all the options have been set and are valid, |
||||||
|
/// throwing an exception if they haven't. |
||||||
|
/// </summary> |
||||||
|
/// <exception cref="InvalidOptionsException">The options are invalid.</exception> |
||||||
|
public void Validate() |
||||||
|
{ |
||||||
|
IList<string> reasons; |
||||||
|
if (!TryValidate(out reasons)) |
||||||
|
{ |
||||||
|
throw new InvalidOptionsException(reasons); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Raw arguments, used to provide defaults for proto file options |
||||||
|
public IList<string> Arguments { get; set; } |
||||||
|
|
||||||
|
[Obsolete("Please use GeneratorOptions.FileOptions.OutputDirectory instead")] |
||||||
|
public string OutputDirectory |
||||||
|
{ |
||||||
|
get { return FileOptions.OutputDirectory; } |
||||||
|
set |
||||||
|
{ |
||||||
|
CSharpFileOptions.Builder bld = FileOptions.ToBuilder(); |
||||||
|
bld.OutputDirectory = value; |
||||||
|
FileOptions = bld.Build(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static readonly Regex ArgMatch = new Regex(@"^[-/](?<name>[\w_]+?)[:=](?<value>.*)$"); |
||||||
|
private CSharpFileOptions fileOptions; |
||||||
|
|
||||||
|
public CSharpFileOptions FileOptions |
||||||
|
{ |
||||||
|
get { return fileOptions ?? (fileOptions = CSharpFileOptions.DefaultInstance); } |
||||||
|
set { fileOptions = value; } |
||||||
|
} |
||||||
|
|
||||||
|
public string LineBreak { get; set; } |
||||||
|
|
||||||
|
private void ParseArguments(IList<string> tmpReasons) |
||||||
|
{ |
||||||
|
bool doHelp = Arguments.Count == 0; |
||||||
|
|
||||||
|
InputFiles = new List<string>(); |
||||||
|
CSharpFileOptions.Builder builder = FileOptions.ToBuilder(); |
||||||
|
Dictionary<string, FieldDescriptor> fields = |
||||||
|
new Dictionary<string, FieldDescriptor>(StringComparer.OrdinalIgnoreCase); |
||||||
|
foreach (FieldDescriptor fld in builder.DescriptorForType.Fields) |
||||||
|
{ |
||||||
|
fields.Add(fld.Name, fld); |
||||||
|
} |
||||||
|
|
||||||
|
foreach (string argument in Arguments) |
||||||
|
{ |
||||||
|
if (StringComparer.OrdinalIgnoreCase.Equals("-help", argument) || |
||||||
|
StringComparer.OrdinalIgnoreCase.Equals("/help", argument) || |
||||||
|
StringComparer.OrdinalIgnoreCase.Equals("-?", argument) || |
||||||
|
StringComparer.OrdinalIgnoreCase.Equals("/?", argument)) |
||||||
|
{ |
||||||
|
doHelp = true; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
Match m = ArgMatch.Match(argument); |
||||||
|
if (m.Success) |
||||||
|
{ |
||||||
|
FieldDescriptor fld; |
||||||
|
string name = m.Groups["name"].Value; |
||||||
|
string value = m.Groups["value"].Value; |
||||||
|
|
||||||
|
if (fields.TryGetValue(name, out fld)) |
||||||
|
{ |
||||||
|
object obj; |
||||||
|
if (TryCoerceType(value, fld, out obj, tmpReasons)) |
||||||
|
{ |
||||||
|
builder[fld] = obj; |
||||||
|
} |
||||||
|
} |
||||||
|
else if (name == "line_break") |
||||||
|
{ |
||||||
|
string tmp; |
||||||
|
if (LineBreaks.TryGetValue(value, out tmp)) |
||||||
|
{ |
||||||
|
LineBreak = tmp; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
tmpReasons.Add("Invalid value for 'line_break': " + value + "."); |
||||||
|
} |
||||||
|
} |
||||||
|
else if (!File.Exists(argument)) |
||||||
|
{ |
||||||
|
doHelp = true; |
||||||
|
tmpReasons.Add("Unknown argument '" + name + "'."); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
InputFiles.Add(argument); |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
InputFiles.Add(argument); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (doHelp || InputFiles.Count == 0) |
||||||
|
{ |
||||||
|
tmpReasons.Add("Arguments:"); |
||||||
|
foreach (KeyValuePair<string, FieldDescriptor> field in fields) |
||||||
|
{ |
||||||
|
tmpReasons.Add(String.Format("-{0}=[{1}]", field.Key, field.Value.FieldType)); |
||||||
|
} |
||||||
|
tmpReasons.Add("-line_break=[" + string.Join("|", new List<string>(LineBreaks.Keys).ToArray()) + "]"); |
||||||
|
tmpReasons.Add("followed by one or more file paths."); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
FileOptions = builder.Build(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static bool TryCoerceType(string text, FieldDescriptor field, out object value, IList<string> tmpReasons) |
||||||
|
{ |
||||||
|
value = null; |
||||||
|
|
||||||
|
switch (field.FieldType) |
||||||
|
{ |
||||||
|
case FieldType.Int32: |
||||||
|
case FieldType.SInt32: |
||||||
|
case FieldType.SFixed32: |
||||||
|
value = Int32.Parse(text); |
||||||
|
break; |
||||||
|
|
||||||
|
case FieldType.Int64: |
||||||
|
case FieldType.SInt64: |
||||||
|
case FieldType.SFixed64: |
||||||
|
value = Int64.Parse(text); |
||||||
|
break; |
||||||
|
|
||||||
|
case FieldType.UInt32: |
||||||
|
case FieldType.Fixed32: |
||||||
|
value = UInt32.Parse(text); |
||||||
|
break; |
||||||
|
|
||||||
|
case FieldType.UInt64: |
||||||
|
case FieldType.Fixed64: |
||||||
|
value = UInt64.Parse(text); |
||||||
|
break; |
||||||
|
|
||||||
|
case FieldType.Float: |
||||||
|
value = float.Parse(text); |
||||||
|
break; |
||||||
|
|
||||||
|
case FieldType.Double: |
||||||
|
value = Double.Parse(text); |
||||||
|
break; |
||||||
|
|
||||||
|
case FieldType.Bool: |
||||||
|
value = Boolean.Parse(text); |
||||||
|
break; |
||||||
|
|
||||||
|
case FieldType.String: |
||||||
|
value = text; |
||||||
|
break; |
||||||
|
|
||||||
|
case FieldType.Enum: |
||||||
|
{ |
||||||
|
EnumDescriptor enumType = field.EnumType; |
||||||
|
|
||||||
|
int number; |
||||||
|
if (int.TryParse(text, out number)) |
||||||
|
{ |
||||||
|
value = enumType.FindValueByNumber(number); |
||||||
|
if (value == null) |
||||||
|
{ |
||||||
|
tmpReasons.Add( |
||||||
|
"Enum type \"" + enumType.FullName + |
||||||
|
"\" has no value with number " + number + "."); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
value = enumType.FindValueByName(text); |
||||||
|
if (value == null) |
||||||
|
{ |
||||||
|
tmpReasons.Add( |
||||||
|
"Enum type \"" + enumType.FullName + |
||||||
|
"\" has no value named \"" + text + "\"."); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
case FieldType.Bytes: |
||||||
|
case FieldType.Message: |
||||||
|
case FieldType.Group: |
||||||
|
tmpReasons.Add("Unhandled field type " + field.FieldType.ToString() + "."); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// http://github.com/jskeet/dotnet-protobufs/ |
||||||
|
// Original C++/Java/Python code: |
||||||
|
// http://code.google.com/p/protobuf/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
namespace Google.ProtocolBuffers.ProtoGen |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// Helpers to resolve class names etc. |
||||||
|
/// </summary> |
||||||
|
internal static class Helpers |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue