diff --git a/src/ScriptEngine.HostedScript/Library/Binary/FileStreamContext.cs b/src/ScriptEngine.HostedScript/Library/Binary/FileStreamContext.cs index e11e17c34..701443769 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/FileStreamContext.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/FileStreamContext.cs @@ -297,7 +297,5 @@ public static FileStreamContext Constructor(IValue filename, IValue openMode, IV ContextValuesMarshaller.ConvertParam(access), ContextValuesMarshaller.ConvertParam(bufferSize)); } - - public object UnderlyingObject => _underlyingStream; } } diff --git a/src/ScriptEngine.HostedScript/Library/Binary/GenericStream.cs b/src/ScriptEngine.HostedScript/Library/Binary/GenericStream.cs index 9c9c3ca1a..1691d3b3a 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/GenericStream.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/GenericStream.cs @@ -11,7 +11,7 @@ This Source Code Form is subject to the terms of the namespace ScriptEngine.HostedScript.Library.Binary { - public interface IStreamWrapper : IObjectWrapper + public interface IStreamWrapper { Stream GetUnderlyingStream(); @@ -47,8 +47,6 @@ public GenericStream(Stream underlyingStream, bool readOnly) public bool IsReadOnly => !CanWrite; - public object UnderlyingObject => _underlyingStream; - /// /// /// Признак доступности записи в поток. diff --git a/src/ScriptEngine.HostedScript/Library/Binary/MemoryStreamContext.cs b/src/ScriptEngine.HostedScript/Library/Binary/MemoryStreamContext.cs index d148b2ab8..70dcb3e25 100644 --- a/src/ScriptEngine.HostedScript/Library/Binary/MemoryStreamContext.cs +++ b/src/ScriptEngine.HostedScript/Library/Binary/MemoryStreamContext.cs @@ -41,8 +41,6 @@ public class MemoryStreamContext : AutoContext, IDisposable _underlyingStream = new MemoryStream(capacity); _commonImpl = new GenericStreamImpl(_underlyingStream); } - - public object UnderlyingObject => _underlyingStream; /// /// diff --git a/src/ScriptEngine.HostedScript/Library/ConsoleContext.cs b/src/ScriptEngine.HostedScript/Library/ConsoleContext.cs index 7f73fe2f4..3f40712ce 100644 --- a/src/ScriptEngine.HostedScript/Library/ConsoleContext.cs +++ b/src/ScriptEngine.HostedScript/Library/ConsoleContext.cs @@ -170,6 +170,24 @@ public IValue InputEncoding Console.InputEncoding = TextEncodingEnum.GetEncoding(value); } } + + /// + /// Возвращает или задает кодировку консоли, используемую при чтении входных данных. + /// + /// КодировкаТекста + [ContextProperty("КодировкаВыходногоПотока", "InputEncoding")] + public IValue OutputEncoding + { + get + { + var encodingEnum = GlobalsManager.GetEnum(); + return encodingEnum.GetValue(Console.OutputEncoding); + } + set + { + Console.OutputEncoding = TextEncodingEnum.GetEncoding(value); + } + } /// /// Воспроизводит звуковой сигнал. @@ -216,21 +234,30 @@ public GenericStream OpenStandardOutput() /// /// Глобально переопределяет стандартный вывод и направляет в другой поток /// - /// Поток назначения + /// Поток назначения [ContextMethod("УстановитьПотокВывода", "SetOutput")] - public void SetOutput(IStreamWrapper stream) + public void SetOutput(IValue target) { - var writer = new StreamWriter(stream.GetUnderlyingStream()); + if (!(target.AsObject() is IStreamWrapper stream)) + throw RuntimeException.InvalidArgumentType(nameof(target)); + + var writer = new StreamWriter(stream.GetUnderlyingStream(), Console.OutputEncoding) + { + AutoFlush = true, + }; Console.SetOut(writer); } /// /// Глобально переопределяет стандартный поток ошибок и направляет в другой поток /// - /// Поток назначения + /// Поток назначения [ContextMethod("УстановитьПотокОшибок", "SetError")] - public void SetError(IStreamWrapper stream) + public void SetError(IValue target) { + if (!(target.AsObject() is IStreamWrapper stream)) + throw RuntimeException.InvalidArgumentType(nameof(target)); + var writer = new StreamWriter(stream.GetUnderlyingStream()); Console.SetError(writer); } diff --git a/tests/console.os b/tests/console.os index 2b2f744d6..d17c6a584 100644 --- a/tests/console.os +++ b/tests/console.os @@ -62,7 +62,7 @@ КонецЦикла; ВыводКоманды = СокрЛП(Процесс.ПотокВывода.Прочитать()); - Сообщить(ВыводКоманды); + УдалитьФайлы(ВремФайл); юТест.ПроверитьРавенство(ВыводКоманды, ТестовыеДанные, "Вывод команды - тестовые данные"); @@ -73,10 +73,18 @@ ВФ = ПолучитьИмяВременногоФайла(); Поток = ФайловыеПотоки.ОткрытьДляЗаписи(ВФ); Консоль.УстановитьПотокВывода(Поток); - Сообщить("Привет мир!"); + Попытка + Сообщить("Привет мир!"); + Исключение + // что-то пошло не так + Консоль.УстановитьПотокВывода(Консоль.ОткрытьСтандартныйПотокВывода()); + ВызватьИсключение; + КонецПопытки; + Поток.Закрыть(); + Консоль.УстановитьПотокВывода(Консоль.ОткрытьСтандартныйПотокВывода()); - Чтение = Новый ЧтениеТекста(ВФ); + Чтение = Новый ЧтениеТекста(ВФ, Консоль.КодировкаВыходногоПотока); Текст = Чтение.Прочитать(); Чтение.Закрыть();