| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace System.IO.Packaging
- {
- class PackUriParser : 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();
- }
- }
- }
|