a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
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();
|
||
}
|
||
}
|
||
}
|