e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
112 lines
4.1 KiB
C#
112 lines
4.1 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="XPathCompileException.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
// <owner current="true" primary="true">[....]</owner>
|
|
//------------------------------------------------------------------------------
|
|
|
|
using System.Runtime.Serialization;
|
|
using System.Security.Permissions;
|
|
using System.Text;
|
|
|
|
namespace System.Xml.Xsl.XPath {
|
|
[Serializable]
|
|
internal class XPathCompileException : XslLoadException {
|
|
public string queryString;
|
|
public int startChar;
|
|
public int endChar;
|
|
|
|
protected XPathCompileException(SerializationInfo info, StreamingContext context)
|
|
: base(info, context)
|
|
{
|
|
queryString = (string)info.GetValue("QueryString", typeof(string));
|
|
startChar = (int) info.GetValue("StartChar" , typeof(int ));
|
|
endChar = (int) info.GetValue("EndChar" , typeof(int ));
|
|
}
|
|
|
|
[SecurityPermissionAttribute(SecurityAction.LinkDemand, SerializationFormatter = true)]
|
|
public override void GetObjectData(SerializationInfo info, StreamingContext context) {
|
|
base.GetObjectData(info, context);
|
|
info.AddValue("QueryString", queryString);
|
|
info.AddValue("StartChar" , startChar);
|
|
info.AddValue("EndChar" , endChar);
|
|
}
|
|
|
|
internal XPathCompileException(string queryString, int startChar, int endChar, string resId, params string[] args)
|
|
: base(resId, args)
|
|
{
|
|
this.queryString = queryString;
|
|
this.startChar = startChar;
|
|
this.endChar = endChar;
|
|
}
|
|
|
|
internal XPathCompileException(string resId, params string[] args)
|
|
: base(resId, args) {} // queryString will be set later
|
|
|
|
private enum TrimType {
|
|
Left,
|
|
Right,
|
|
Middle,
|
|
}
|
|
|
|
// This function is used to prevent long quotations in error messages, SQLBUDT 222626
|
|
private static void AppendTrimmed(StringBuilder sb, string value, int startIndex, int count, TrimType trimType) {
|
|
const int TrimSize = 32;
|
|
const string TrimMarker = "...";
|
|
|
|
if (count <= TrimSize) {
|
|
sb.Append(value, startIndex, count);
|
|
} else {
|
|
switch (trimType) {
|
|
case TrimType.Left:
|
|
sb.Append(TrimMarker);
|
|
sb.Append(value, startIndex + count - TrimSize, TrimSize);
|
|
break;
|
|
case TrimType.Right:
|
|
sb.Append(value, startIndex, TrimSize);
|
|
sb.Append(TrimMarker);
|
|
break;
|
|
case TrimType.Middle:
|
|
sb.Append(value, startIndex, TrimSize / 2);
|
|
sb.Append(TrimMarker);
|
|
sb.Append(value, startIndex + count - TrimSize / 2, TrimSize / 2);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
internal string MarkOutError() {
|
|
if (queryString == null || queryString.Trim(' ').Length == 0) {
|
|
return null;
|
|
}
|
|
|
|
int len = endChar - startChar;
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
AppendTrimmed(sb, queryString, 0, startChar, TrimType.Left);
|
|
if (len > 0) {
|
|
sb.Append(" -->");
|
|
AppendTrimmed(sb, queryString, startChar, len, TrimType.Middle);
|
|
}
|
|
|
|
sb.Append("<-- ");
|
|
AppendTrimmed(sb, queryString, endChar, queryString.Length - endChar, TrimType.Right);
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
internal override string FormatDetailedMessage() {
|
|
string message = Message;
|
|
string error = MarkOutError();
|
|
|
|
if (error != null && error.Length > 0) {
|
|
if (message.Length > 0) {
|
|
message += Environment.NewLine;
|
|
}
|
|
message += error;
|
|
}
|
|
return message;
|
|
}
|
|
}
|
|
}
|