|
@@ -3,6 +3,7 @@ using System.Text;
|
|
|
using System.IO;
|
|
|
using System.Xml;
|
|
|
using Google.ProtocolBuffers.Serialization;
|
|
|
+using Google.ProtocolBuffers.Serialization.Http;
|
|
|
|
|
|
namespace Google.ProtocolBuffers
|
|
|
{
|
|
@@ -43,6 +44,28 @@ namespace Google.ProtocolBuffers
|
|
|
return w.ToString();
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Writes the message instance to the stream using the content type provided
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="message">An instance of a message</param>
|
|
|
+ /// <param name="options">Options specific to writing this message and/or content type</param>
|
|
|
+ /// <param name="contentType">The mime type of the content to be written</param>
|
|
|
+ /// <param name="output">The stream to write the message to</param>
|
|
|
+ public static void WriteTo(this IMessageLite message, MessageFormatOptions options, string contentType, Stream output)
|
|
|
+ {
|
|
|
+ ICodedOutputStream codedOutput = MessageFormatFactory.CreateOutputStream(options, contentType, output);
|
|
|
+
|
|
|
+ // Output the appropriate message preamble
|
|
|
+ codedOutput.WriteMessageStart();
|
|
|
+
|
|
|
+ // Write the message content to the output
|
|
|
+ message.WriteTo(codedOutput);
|
|
|
+
|
|
|
+ // Write the closing message fragment
|
|
|
+ codedOutput.WriteMessageEnd();
|
|
|
+ codedOutput.Flush();
|
|
|
+ }
|
|
|
+
|
|
|
#endregion
|
|
|
#region IBuilderLite Extensions
|
|
|
/// <summary>
|
|
@@ -95,6 +118,48 @@ namespace Google.ProtocolBuffers
|
|
|
.Merge(rootElementName, builder, extensionRegistry);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Merges the message from the input stream based on the contentType provided
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="TBuilder">A type derived from IBuilderLite</typeparam>
|
|
|
+ /// <param name="builder">An instance of a message builder</param>
|
|
|
+ /// <param name="options">Options specific to reading this message and/or content type</param>
|
|
|
+ /// <param name="contentType">The mime type of the input stream content</param>
|
|
|
+ /// <param name="input">The stream to read the message from</param>
|
|
|
+ /// <returns>The same builder instance that was supplied in the builder parameter</returns>
|
|
|
+ public static TBuilder MergeFrom<TBuilder>(this TBuilder builder, MessageFormatOptions options, string contentType, Stream input) where TBuilder : IBuilderLite
|
|
|
+ {
|
|
|
+ ICodedInputStream codedInput = MessageFormatFactory.CreateInputStream(options, contentType, input);
|
|
|
+ codedInput.ReadMessageStart();
|
|
|
+ builder.WeakMergeFrom(codedInput, options.ExtensionRegistry);
|
|
|
+ codedInput.ReadMessageEnd();
|
|
|
+ return builder;
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+ #region IRpcServerStub Extensions
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Used to implement a service endpoint on an HTTP server. This works with services generated with the
|
|
|
+ /// service_generator_type option set to IRPCDISPATCH.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="stub">The service execution stub</param>
|
|
|
+ /// <param name="methodName">The name of the method being invoked</param>
|
|
|
+ /// <param name="options">optional arguments for the format reader/writer</param>
|
|
|
+ /// <param name="contentType">The mime type for the input stream</param>
|
|
|
+ /// <param name="input">The input stream</param>
|
|
|
+ /// <param name="responseType">The mime type for the output stream</param>
|
|
|
+ /// <param name="output">The output stream</param>
|
|
|
+ public static void HttpCallMethod(this IRpcServerStub stub, string methodName, MessageFormatOptions options,
|
|
|
+ string contentType, Stream input, string responseType, Stream output)
|
|
|
+ {
|
|
|
+ ICodedInputStream codedInput = MessageFormatFactory.CreateInputStream(options, contentType, input);
|
|
|
+ codedInput.ReadMessageStart();
|
|
|
+ IMessageLite response = stub.CallMethod(methodName, codedInput, options.ExtensionRegistry);
|
|
|
+ codedInput.ReadMessageEnd();
|
|
|
+ response.WriteTo(options, responseType, output);
|
|
|
+ }
|
|
|
+
|
|
|
#endregion
|
|
|
}
|
|
|
}
|