106 lines
3.2 KiB
C#
106 lines
3.2 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
|
|
namespace Microsoft.AspNetCore.Razor.Language
|
|
{
|
|
internal class StringSourceDocument : RazorSourceDocument
|
|
{
|
|
private readonly string _content;
|
|
private readonly RazorSourceLineCollection _lines;
|
|
private byte[] _checksum;
|
|
|
|
public StringSourceDocument(string content, Encoding encoding, RazorSourceDocumentProperties properties)
|
|
{
|
|
if (content == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(content));
|
|
}
|
|
|
|
if (encoding == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(encoding));
|
|
}
|
|
|
|
if (properties == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(properties));
|
|
}
|
|
|
|
_content = content;
|
|
Encoding = encoding;
|
|
FilePath = properties.FilePath;
|
|
RelativePath = properties.RelativePath;
|
|
|
|
_lines = new DefaultRazorSourceLineCollection(this);
|
|
}
|
|
|
|
public override char this[int position] => _content[position];
|
|
|
|
public override Encoding Encoding { get; }
|
|
|
|
public override string FilePath { get; }
|
|
|
|
public override int Length => _content.Length;
|
|
|
|
public override RazorSourceLineCollection Lines => _lines;
|
|
|
|
public override string RelativePath { get; }
|
|
|
|
public override void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
|
|
{
|
|
if (destination == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(destination));
|
|
}
|
|
|
|
if (sourceIndex < 0)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(sourceIndex));
|
|
}
|
|
|
|
if (destinationIndex < 0)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(destinationIndex));
|
|
}
|
|
|
|
if (count < 0 || count > Length - sourceIndex || count > destination.Length - destinationIndex)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(count));
|
|
}
|
|
|
|
if (count == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_content.CopyTo(sourceIndex, destination, destinationIndex, count);
|
|
}
|
|
|
|
public override byte[] GetChecksum()
|
|
{
|
|
if (_checksum == null)
|
|
{
|
|
var charBuffer = _content.ToCharArray();
|
|
var encoder = Encoding.GetEncoder();
|
|
var byteCount = encoder.GetByteCount(charBuffer, 0, charBuffer.Length, flush: true);
|
|
var bytes = new byte[byteCount];
|
|
encoder.GetBytes(charBuffer, 0, charBuffer.Length, bytes, 0, flush: true);
|
|
|
|
using (var hashAlgorithm = SHA1.Create())
|
|
{
|
|
_checksum = hashAlgorithm.ComputeHash(bytes);
|
|
}
|
|
}
|
|
|
|
var copiedChecksum = new byte[_checksum.Length];
|
|
_checksum.CopyTo(copiedChecksum, 0);
|
|
|
|
return copiedChecksum;
|
|
}
|
|
}
|
|
}
|