Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

114 lines
3.5 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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();
}
}
}