114 lines
3.5 KiB
C#
114 lines
3.5 KiB
C#
|
// PackUriParser.cs created with MonoDevelop
|
|||
|
// User: alan at 14:50 31/10/2008
|
|||
|
//
|
|||
|
// To change standard headers go to Edit->Preferences->Coding->Standard Headers
|
|||
|
//
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace System.IO.Packaging
|
|||
|
{
|
|||
|
class PackUriParser : System.GenericUriParser
|
|||
|
{
|
|||
|
const string SchemaName = "pack";
|
|||
|
|
|||
|
StringBuilder builder = new StringBuilder();
|
|||
|
|
|||
|
public PackUriParser ()
|
|||
|
: base (GenericUriParserOptions.Default)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override string GetComponents(Uri uri, UriComponents components, UriFormat format)
|
|||
|
{
|
|||
|
string s = uri.OriginalString;
|
|||
|
builder.Remove(0, builder.Length);
|
|||
|
|
|||
|
if ((components & UriComponents.Scheme) == UriComponents.Scheme)
|
|||
|
{
|
|||
|
int start = 0;
|
|||
|
int end = s.IndexOf(':');
|
|||
|
builder.Append(s, start, end - start);
|
|||
|
}
|
|||
|
|
|||
|
if ((components & UriComponents.Host) == UriComponents.Host)
|
|||
|
{
|
|||
|
// Skip past pack://
|
|||
|
int start = 7;
|
|||
|
int end = s.IndexOf('/', start);
|
|||
|
if (end == -1)
|
|||
|
end = s.Length;
|
|||
|
|
|||
|
if (builder.Length > 0)
|
|||
|
builder.Append("://");
|
|||
|
|
|||
|
builder.Append(s, start, end - start);
|
|||
|
}
|
|||
|
|
|||
|
// Port is always -1, so i think i can ignore both Port and StrongPort
|
|||
|
// Normally they'd get parsed here
|
|||
|
|
|||
|
if ((components & UriComponents.Path) == UriComponents.Path)
|
|||
|
{
|
|||
|
// Skip past pack://
|
|||
|
int start = s.IndexOf('/', 7);
|
|||
|
int end = s.IndexOf('?');
|
|||
|
if (end == -1)
|
|||
|
end = s.IndexOf('#');
|
|||
|
if (end == -1)
|
|||
|
end = s.Length;
|
|||
|
|
|||
|
if ((components & UriComponents.KeepDelimiter) != UriComponents.KeepDelimiter &&
|
|||
|
builder.Length == 0)
|
|||
|
start++;
|
|||
|
|
|||
|
if (start > 0) builder.Append(s, start, end - start);
|
|||
|
}
|
|||
|
|
|||
|
if ((components & UriComponents.Query) == UriComponents.Query)
|
|||
|
{
|
|||
|
int index = s.IndexOf('?');
|
|||
|
|
|||
|
if (index != -1)
|
|||
|
{
|
|||
|
if ((components & UriComponents.KeepDelimiter) != UriComponents.KeepDelimiter &&
|
|||
|
builder.Length == 0)
|
|||
|
index++;
|
|||
|
|
|||
|
int fragIndex = s.IndexOf('#');
|
|||
|
int end = fragIndex == -1 ? s.Length : fragIndex;
|
|||
|
builder.Append(s, index, end - index);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if ((components & UriComponents.Fragment) == UriComponents.Fragment)
|
|||
|
{
|
|||
|
int index = s.IndexOf('#');
|
|||
|
|
|||
|
if (index != -1)
|
|||
|
{
|
|||
|
if ((components & UriComponents.KeepDelimiter) != UriComponents.KeepDelimiter &&
|
|||
|
builder.Length == 0)
|
|||
|
index++;
|
|||
|
|
|||
|
builder.Append(s, index, s.Length - index);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return builder.ToString();
|
|||
|
}
|
|||
|
|
|||
|
protected override void InitializeAndValidate(Uri uri, out UriFormatException parsingError)
|
|||
|
{
|
|||
|
parsingError = null;
|
|||
|
}
|
|||
|
|
|||
|
protected override UriParser OnNewUri()
|
|||
|
{
|
|||
|
return new PackUriParser();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|