forked from PowerShell/PowerShell
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathConsoleHostTranscript.cs
More file actions
130 lines (110 loc) · 3.92 KB
/
Copy pathConsoleHostTranscript.cs
File metadata and controls
130 lines (110 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using System.IO;
using System.Management.Automation.Host;
using System.Management.Automation.Internal;
namespace Microsoft.PowerShell
{
internal sealed partial class ConsoleHost : PSHost, IDisposable
{
internal bool IsTranscribing
{
get
{
// no locking because the compare should be atomic
return _isTranscribing;
}
set
{
_isTranscribing = value;
}
}
private bool _isTranscribing;
/*
internal void StartTranscribing(string transcriptFilename, bool shouldAppend)
{
// lock so as not to contend with IsTranscribing and StopTranscribing
lock (transcriptionStateLock)
{
Dbg.Assert(transcriptionWriter == null, "writer should not exist");
this.transcriptFileName = transcriptFilename;
transcriptionWriter = new StreamWriter(transcriptFilename, shouldAppend, new System.Text.UnicodeEncoding());
transcriptionWriter.AutoFlush = true;
string format = ConsoleHostStrings.TranscriptPrologue;
string line =
StringUtil.Format(
format,
DateTime.Now,
Environment.UserDomainName,
Environment.UserName,
Environment.MachineName,
Environment.OSVersion.VersionString);
transcriptionWriter.WriteLine(line);
// record that we are transcribing...
isTranscribing = true;
}
}
*/
private readonly string _transcriptFileName = string.Empty;
internal string StopTranscribing()
{
lock (_transcriptionStateLock)
{
if (_transcriptionWriter == null)
{
return null;
}
// The filestream *must* be closed at the end of this method.
// If it isn't and there is a pending IO error, the finalizer will
// dispose the stream resulting in an IO exception on the finalizer thread
// which will crash the process...
try
{
_transcriptionWriter.WriteLine(
StringUtil.Format(ConsoleHostStrings.TranscriptEpilogue, DateTime.Now));
}
finally
{
try
{
_transcriptionWriter.Dispose();
}
finally
{
_transcriptionWriter = null;
_isTranscribing = false;
}
}
return _transcriptFileName;
}
}
internal void WriteToTranscript(ReadOnlySpan<char> text)
{
WriteToTranscript(text, newLine: false);
}
internal void WriteLineToTranscript(ReadOnlySpan<char> text)
{
WriteToTranscript(text, newLine: true);
}
internal void WriteToTranscript(ReadOnlySpan<char> text, bool newLine)
{
lock (_transcriptionStateLock)
{
if (_isTranscribing && _transcriptionWriter != null)
{
if (newLine)
{
_transcriptionWriter.WriteLine(text);
}
else
{
_transcriptionWriter.Write(text);
}
}
}
}
private StreamWriter _transcriptionWriter;
private readonly object _transcriptionStateLock = new object();
}
} // namespace