mirror of
https://github.com/ZuneDev/ZuneShell.dll.git
synced 2026-07-27 13:11:51 -07:00
246 lines
8.6 KiB
C#
246 lines
8.6 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: ZuneXml.XmlDataVirtualList
|
|
// Assembly: ZuneShell, Version=4.7.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
|
|
// MVID: FC8028F3-A47B-4FB4-B35B-11D1752D8264
|
|
// Assembly location: C:\Program Files\Zune\ZuneShell.dll
|
|
|
|
using Microsoft.Iris;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Threading;
|
|
|
|
namespace ZuneXml
|
|
{
|
|
public class XmlDataVirtualList : VirtualList, IXmlDataProviderObject
|
|
{
|
|
private DataProviderQuery _owner;
|
|
private int _currentIndex;
|
|
private object _itemTypeCookie;
|
|
private ConstructObject _itemConstructor;
|
|
private int _chunkStartIndex;
|
|
private List<XmlDataProviderObject> _chunkItems;
|
|
private string _encodedSortBy;
|
|
private string[] _sortBy;
|
|
private bool[] _sortAscending;
|
|
private IPageInfo _nextPage;
|
|
private bool _pageToEnd;
|
|
|
|
public XmlDataVirtualList(DataProviderQuery owner, object itemTypeCookie)
|
|
: base(true)
|
|
{
|
|
this._owner = owner;
|
|
this._itemTypeCookie = itemTypeCookie;
|
|
this._itemConstructor = itemTypeCookie == null ? null : XmlDataProviderObjectFactory.GetConstructor(itemTypeCookie);
|
|
this._currentIndex = -1;
|
|
this._chunkStartIndex = 0;
|
|
this._encodedSortBy = null;
|
|
this._sortAscending = null;
|
|
this._sortBy = null;
|
|
}
|
|
|
|
internal IPageInfo NextPage
|
|
{
|
|
get => this._nextPage;
|
|
set => this._nextPage = value;
|
|
}
|
|
|
|
public bool PageToEnd
|
|
{
|
|
get => this._pageToEnd;
|
|
set
|
|
{
|
|
if (this._pageToEnd == value)
|
|
return;
|
|
this._pageToEnd = value;
|
|
if (!this._pageToEnd)
|
|
return;
|
|
this.GetNextChunk();
|
|
}
|
|
}
|
|
|
|
protected override object OnRequestItem(int index) => this.Data[index];
|
|
|
|
protected override void OnRequestSlowData(int index)
|
|
{
|
|
this.NotifySlowDataAcquireComplete(index);
|
|
if (index != this.Count - 1 || this._chunkStartIndex == this.Count || (this.NextPage == null || this.PageToEnd))
|
|
return;
|
|
this.GetNextChunk();
|
|
}
|
|
|
|
private void GetNextChunk()
|
|
{
|
|
if (this.NextPage == null)
|
|
return;
|
|
this._chunkStartIndex = this.Count;
|
|
this._currentIndex = -1;
|
|
if (!(this._owner is XmlDataProviderQuery owner))
|
|
return;
|
|
ThreadPool.QueueUserWorkItem(new WaitCallback(GetNextChunkThread), new GetNextChunkArgs(owner, this.NextPage, this._chunkStartIndex));
|
|
}
|
|
|
|
private static void GetNextChunkThread(object obj)
|
|
{
|
|
GetNextChunkArgs getNextChunkArgs = (GetNextChunkArgs)obj;
|
|
string pageUrl = getNextChunkArgs.PageInfo.GetPageUrl(getNextChunkArgs.StartIndex);
|
|
string pagePostBody = getNextChunkArgs.PageInfo.GetPagePostBody(getNextChunkArgs.StartIndex);
|
|
if (string.IsNullOrEmpty(pageUrl))
|
|
return;
|
|
getNextChunkArgs.Query.GetDataFromResource(pageUrl, pagePostBody, false);
|
|
}
|
|
|
|
public bool ProcessXPath(
|
|
string currentXPath,
|
|
Hashtable attributes,
|
|
List<XmlDataProviderQuery.XPathMatch> matches)
|
|
{
|
|
bool flag = false;
|
|
if (string.IsNullOrEmpty(currentXPath))
|
|
{
|
|
if (this._chunkItems == null)
|
|
this._chunkItems = new List<XmlDataProviderObject>();
|
|
++this._currentIndex;
|
|
if (this._itemConstructor != null)
|
|
this._chunkItems.Add(this._itemConstructor(this._owner, this._itemTypeCookie));
|
|
else
|
|
this._chunkItems.Add(new XmlDataProviderObject(this._owner, this._itemTypeCookie));
|
|
}
|
|
else
|
|
{
|
|
IXmlDataProviderObject chunkItem = this._chunkItems[this._currentIndex];
|
|
if (chunkItem != null)
|
|
flag = chunkItem.ProcessXPath(currentXPath, attributes, matches);
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
internal void TransferToAppThread()
|
|
{
|
|
if (this._chunkItems == null)
|
|
return;
|
|
foreach (XmlDataProviderObject chunkItem in this._chunkItems)
|
|
chunkItem.TransferToAppThread();
|
|
int count = 0;
|
|
foreach (XmlDataProviderObject chunkItem in this._chunkItems)
|
|
{
|
|
if (!(this._owner is XmlDataProviderQuery owner) || !owner.FilterDataProviderObject(chunkItem))
|
|
this.Data[this._chunkStartIndex + count++] = chunkItem;
|
|
}
|
|
this.AddRange(count);
|
|
this.Sort();
|
|
this._chunkItems.Clear();
|
|
}
|
|
|
|
internal void OnQueryComplete()
|
|
{
|
|
if (this.NextPage == null || !this.PageToEnd)
|
|
return;
|
|
this.GetNextChunk();
|
|
}
|
|
|
|
private void Sort()
|
|
{
|
|
if (this._sortBy == null || this._sortBy.Length <= 0 || this.Count <= 1)
|
|
return;
|
|
IPageInfo nextPage = this.NextPage;
|
|
XmlDataProviderObject[] array = new XmlDataProviderObject[this.Count];
|
|
if (array == null)
|
|
return;
|
|
for (int index = 0; index < this.Count; ++index)
|
|
array[index] = (XmlDataProviderObject)this.Data[index];
|
|
Array.Sort(array, new Comparison<XmlDataProviderObject>(this.CompareUsingSortBy));
|
|
for (int index = 0; index < this.Count; ++index)
|
|
{
|
|
this.Data[index] = array[index];
|
|
this.Modified(index);
|
|
}
|
|
}
|
|
|
|
public string SortBy
|
|
{
|
|
get => this._encodedSortBy;
|
|
set
|
|
{
|
|
if (!(this._encodedSortBy != value))
|
|
return;
|
|
string[] strArray1 = null;
|
|
bool[] flagArray = null;
|
|
if (!string.IsNullOrEmpty(value))
|
|
{
|
|
string[] strArray2 = value.Split(',');
|
|
strArray1 = new string[strArray2.Length];
|
|
flagArray = new bool[strArray2.Length];
|
|
for (int index = 0; index < strArray2.Length; ++index)
|
|
this.ExtractSortData(strArray2[index], out strArray1[index], out flagArray[index]);
|
|
}
|
|
this._sortBy = strArray1;
|
|
this._sortAscending = flagArray;
|
|
this.Sort();
|
|
}
|
|
}
|
|
|
|
private void ExtractSortData(string sort, out string filteredValue, out bool sortAscending)
|
|
{
|
|
filteredValue = sort;
|
|
sortAscending = true;
|
|
if (string.IsNullOrEmpty(sort))
|
|
return;
|
|
if (sort[0] == '-')
|
|
{
|
|
filteredValue = sort.Substring(1);
|
|
sortAscending = false;
|
|
}
|
|
else
|
|
{
|
|
if (sort[0] != '+')
|
|
return;
|
|
filteredValue = sort.Substring(1);
|
|
sortAscending = true;
|
|
}
|
|
}
|
|
|
|
private int CompareUsingSortBy(XmlDataProviderObject x, XmlDataProviderObject y)
|
|
{
|
|
int num = 0;
|
|
for (int index = 0; index < this._sortBy.Length; ++index)
|
|
{
|
|
num = Compare(x, y, this._sortBy[index], this._sortAscending[index]);
|
|
if (num != 0)
|
|
break;
|
|
}
|
|
return num;
|
|
}
|
|
|
|
private static int Compare(
|
|
XmlDataProviderObject x,
|
|
XmlDataProviderObject y,
|
|
string propertyName,
|
|
bool ascending)
|
|
{
|
|
object property1 = x.GetProperty(propertyName);
|
|
object property2 = y.GetProperty(propertyName);
|
|
IComparable comparable1 = property1 as IComparable;
|
|
IComparable comparable2 = property2 as IComparable;
|
|
if (comparable1 == null || comparable2 == null)
|
|
return 0;
|
|
int num = comparable1.CompareTo(comparable2);
|
|
return ascending ? num : -num;
|
|
}
|
|
|
|
private class GetNextChunkArgs
|
|
{
|
|
public readonly XmlDataProviderQuery Query;
|
|
public readonly IPageInfo PageInfo;
|
|
public readonly int StartIndex;
|
|
|
|
public GetNextChunkArgs(XmlDataProviderQuery query, IPageInfo pageInfo, int startIndex)
|
|
{
|
|
this.Query = query;
|
|
this.PageInfo = pageInfo;
|
|
this.StartIndex = startIndex;
|
|
}
|
|
}
|
|
}
|
|
}
|