/// <summary>Constructor.</summary> /// <param name="textReader">The text reader to use.</param> /// <param name="messageInfo">The context information for the message.</param> /// <param name="messageReaderSettings">Configuration settings of the OData reader.</param> internal ODataJsonLightInputContext( TextReader textReader, ODataMessageInfo messageInfo, ODataMessageReaderSettings messageReaderSettings) : base(ODataFormat.Json, messageInfo, messageReaderSettings) { Debug.Assert(messageInfo.MediaType != null, "messageInfo.MediaType != null"); try { this.textReader = textReader; var innerReader = CreateJsonReader(this.Container, this.textReader, messageInfo.MediaType.HasIeee754CompatibleSetToTrue()); if (messageReaderSettings.ArrayPool != null) { // make sure customer also can use reading setting if without DI. JsonReader jsonReader = innerReader as JsonReader; if (jsonReader != null && jsonReader.ArrayPool == null) { jsonReader.ArrayPool = messageReaderSettings.ArrayPool; } } if (messageInfo.MediaType.HasStreamingSetToTrue()) { this.jsonReader = new BufferingJsonReader( innerReader, JsonLightConstants.ODataErrorPropertyName, messageReaderSettings.MessageQuotas.MaxNestingDepth); } else { // If we have a non-streaming Json Light content type we need to use the re-ordering Json reader this.jsonReader = new ReorderingJsonReader(innerReader, messageReaderSettings.MessageQuotas.MaxNestingDepth); } } catch (Exception e) { // Dispose the message stream if we failed to create the input context. if (ExceptionUtils.IsCatchableExceptionType(e) && this.textReader != null) { this.textReader.Dispose(); } throw; } // don't know how to get MetadataDocumentUri uri here, messageReaderSettings do not have one // Uri metadataDocumentUri = messageReaderSettings..MetadataDocumentUri == null ? null : messageReaderSettings.MetadataDocumentUri.BaseUri; // the uri here is used here to create the FullMetadataLevel can pass null in this.metadataLevel = JsonLightMetadataLevel.Create(messageInfo.MediaType, null, this.Model, this.ReadingResponse); }
/// <summary> /// Constructor. /// </summary> /// <param name="textWriter">The text writer to write to.</param> /// <param name="messageInfo">The context information for the message.</param> /// <param name="messageWriterSettings">Configuration settings of the OData writer.</param> internal ODataJsonLightOutputContext( TextWriter textWriter, ODataMessageInfo messageInfo, ODataMessageWriterSettings messageWriterSettings) : base(ODataFormat.Json, messageInfo, messageWriterSettings) { Debug.Assert(!this.WritingResponse, "Expecting WritingResponse to always be false for this constructor, so no need to validate the MetadataDocumentUri on the writer settings."); Debug.Assert(textWriter != null, "textWriter != null"); Debug.Assert(messageWriterSettings != null, "messageWriterSettings != null"); this.textWriter = textWriter; this.jsonWriter = CreateJsonWriter(messageInfo.Container, textWriter, true /*isIeee754Compatible*/); this.metadataLevel = new JsonMinimalMetadataLevel(); this.propertyCacheHandler = new PropertyCacheHandler(); }
/// <summary> /// Constructor. /// </summary> /// <param name="messageInfo">The context information for the message.</param> /// <param name="messageWriterSettings">Configuration settings of the OData writer.</param> public ODataJsonLightOutputContext( ODataMessageInfo messageInfo, ODataMessageWriterSettings messageWriterSettings) : base(ODataFormat.Json, messageInfo, messageWriterSettings) { Debug.Assert(messageInfo.MessageStream != null, "messageInfo.MessageStream != null"); Debug.Assert(messageInfo.MediaType != null, "messageInfo.MediaType != null"); try { this.messageOutputStream = messageInfo.MessageStream; Stream outputStream; if (this.Synchronous) { outputStream = this.messageOutputStream; } else { this.asynchronousOutputStream = new AsyncBufferedStream(this.messageOutputStream); outputStream = this.asynchronousOutputStream; } this.textWriter = new StreamWriter(outputStream, messageInfo.Encoding); // COMPAT 2: JSON indentation - WCFDS indents only partially, it inserts newlines but doesn't actually insert spaces for indentation // in here we allow the user to specify if true indentation should be used or if the limited functionality is enough. this.jsonWriter = CreateJsonWriter(this.Container, this.textWriter, messageInfo.MediaType.HasIeee754CompatibleSetToTrue(), messageWriterSettings); } catch (Exception e) { // Dispose the message stream if we failed to create the input context. if (ExceptionUtils.IsCatchableExceptionType(e)) { this.messageOutputStream.Dispose(); } throw; } Uri metadataDocumentUri = messageWriterSettings.MetadataDocumentUri; bool alwaysAddTypeAnnotationsForDerivedTypes = messageWriterSettings.AlwaysAddTypeAnnotationsForDerivedTypes; this.metadataLevel = JsonLightMetadataLevel.Create(messageInfo.MediaType, metadataDocumentUri, alwaysAddTypeAnnotationsForDerivedTypes, this.Model, this.WritingResponse); this.propertyCacheHandler = new PropertyCacheHandler(); }