Skip to content

Commit

Permalink
fixed #583 fixed #746
Browse files Browse the repository at this point in the history
  • Loading branch information
EvilBeaver committed Jul 24, 2021
1 parent f40bb11 commit 0e259aa
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,5 @@ public static FileStreamContext Constructor(IValue filename, IValue openMode, IV
ContextValuesMarshaller.ConvertParam<FileAccessEnum>(access),
ContextValuesMarshaller.ConvertParam<int>(bufferSize));
}

public object UnderlyingObject => _underlyingStream;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -47,8 +47,6 @@ public GenericStream(Stream underlyingStream, bool readOnly)

public bool IsReadOnly => !CanWrite;

public object UnderlyingObject => _underlyingStream;

/// <summary>
///
/// Признак доступности записи в поток.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ public class MemoryStreamContext : AutoContext<MemoryStreamContext>, IDisposable
_underlyingStream = new MemoryStream(capacity);
_commonImpl = new GenericStreamImpl(_underlyingStream);
}

public object UnderlyingObject => _underlyingStream;

/// <summary>
///
Expand Down
37 changes: 32 additions & 5 deletions src/ScriptEngine.HostedScript/Library/ConsoleContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,24 @@ public IValue InputEncoding
Console.InputEncoding = TextEncodingEnum.GetEncoding(value);
}
}

/// <summary>
/// Возвращает или задает кодировку консоли, используемую при чтении входных данных.
/// </summary>
/// <returns>КодировкаТекста</returns>
[ContextProperty("КодировкаВыходногоПотока", "InputEncoding")]
public IValue OutputEncoding
{
get
{
var encodingEnum = GlobalsManager.GetEnum<TextEncodingEnum>();
return encodingEnum.GetValue(Console.OutputEncoding);
}
set
{
Console.OutputEncoding = TextEncodingEnum.GetEncoding(value);
}
}

/// <summary>
/// Воспроизводит звуковой сигнал.
Expand Down Expand Up @@ -216,21 +234,30 @@ public GenericStream OpenStandardOutput()
/// <summary>
/// Глобально переопределяет стандартный вывод и направляет в другой поток
/// </summary>
/// <param name="stream">Поток назначения</param>
/// <param name="target">Поток назначения</param>
[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);
}

/// <summary>
/// Глобально переопределяет стандартный поток ошибок и направляет в другой поток
/// </summary>
/// <param name="stream">Поток назначения</param>
/// <param name="target">Поток назначения</param>
[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);
}
Expand Down
14 changes: 11 additions & 3 deletions tests/console.os
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
КонецЦикла;

ВыводКоманды = СокрЛП(Процесс.ПотокВывода.Прочитать());
Сообщить(ВыводКоманды);
УдалитьФайлы(ВремФайл);

юТест.ПроверитьРавенство(ВыводКоманды, ТестовыеДанные, "Вывод команды - тестовые данные");

Expand All @@ -73,10 +73,18 @@
ВФ = ПолучитьИмяВременногоФайла();
Поток = ФайловыеПотоки.ОткрытьДляЗаписи(ВФ);
Консоль.УстановитьПотокВывода(Поток);
Сообщить("Привет мир!");
Попытка
Сообщить("Привет мир!");
Исключение
// что-то пошло не так
Консоль.УстановитьПотокВывода(Консоль.ОткрытьСтандартныйПотокВывода());
ВызватьИсключение;
КонецПопытки;

Поток.Закрыть();
Консоль.УстановитьПотокВывода(Консоль.ОткрытьСтандартныйПотокВывода());

Чтение = Новый ЧтениеТекста(ВФ);
Чтение = Новый ЧтениеТекста(ВФ, Консоль.КодировкаВыходногоПотока);
Текст = Чтение.Прочитать();
Чтение.Закрыть();

Expand Down

0 comments on commit 0e259aa

Please sign in to comment.