mirror of
https://github.com/ZuneDev/ZuneShell.dll.git
synced 2026-07-27 13:11:51 -07:00
365 lines
16 KiB
C#
365 lines
16 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: ZuneXml.XmlDataProviderObject
|
|
// 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 Microsoft.Zune.Shell;
|
|
using MicrosoftZuneLibrary;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Xml;
|
|
|
|
namespace ZuneXml
|
|
{
|
|
public class XmlDataProviderObject : DataProviderObject, IXmlDataProviderObject, IDatabaseMedia
|
|
{
|
|
private static string _strUuidPrefix1 = "urn:uuid:";
|
|
private static string _strUuidPrefix2 = "uid:uuid:";
|
|
private Dictionary<string, object> _propertyValues;
|
|
|
|
public XmlDataProviderObject(DataProviderQuery owner, object resultTypeCookie)
|
|
: base(owner, resultTypeCookie)
|
|
{
|
|
foreach (DataProviderMapping dataProviderMapping in Mappings.Values)
|
|
{
|
|
string propertyTypeName = dataProviderMapping.PropertyTypeName;
|
|
if (!this.IsXmlValueType(propertyTypeName))
|
|
{
|
|
if (propertyTypeName == "List")
|
|
this.SetProperty(dataProviderMapping.PropertyName, new XmlDataVirtualList(this.Owner, dataProviderMapping.UnderlyingCollectionTypeCookie));
|
|
else
|
|
this.SetProperty(dataProviderMapping.PropertyName, XmlDataProviderObjectFactory.CreateObject(this.Owner, dataProviderMapping.PropertyTypeCookie));
|
|
}
|
|
}
|
|
}
|
|
|
|
internal IPageInfo NextPage
|
|
{
|
|
get
|
|
{
|
|
IPageInfo pageInfo = null;
|
|
foreach (DataProviderMapping dataProviderMapping in Mappings.Values)
|
|
{
|
|
if (dataProviderMapping.PropertyTypeName == "List")
|
|
{
|
|
XmlDataVirtualList property = (XmlDataVirtualList)this.GetProperty(dataProviderMapping.PropertyName);
|
|
if (property != null)
|
|
{
|
|
pageInfo = property.NextPage;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return pageInfo;
|
|
}
|
|
set
|
|
{
|
|
foreach (DataProviderMapping dataProviderMapping in Mappings.Values)
|
|
{
|
|
if (dataProviderMapping.PropertyTypeName == "List")
|
|
{
|
|
XmlDataVirtualList property = (XmlDataVirtualList)this.GetProperty(dataProviderMapping.PropertyName);
|
|
if (property != null)
|
|
property.NextPage = value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool PageToEnd
|
|
{
|
|
get
|
|
{
|
|
bool flag = false;
|
|
foreach (DataProviderMapping dataProviderMapping in Mappings.Values)
|
|
{
|
|
if (dataProviderMapping.PropertyTypeName == "List")
|
|
{
|
|
XmlDataVirtualList property = (XmlDataVirtualList)this.GetProperty(dataProviderMapping.PropertyName);
|
|
if (property != null)
|
|
{
|
|
flag = property.PageToEnd;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return flag;
|
|
}
|
|
set
|
|
{
|
|
foreach (DataProviderMapping dataProviderMapping in Mappings.Values)
|
|
{
|
|
if (dataProviderMapping.PropertyTypeName == "List")
|
|
{
|
|
XmlDataVirtualList property = (XmlDataVirtualList)this.GetProperty(dataProviderMapping.PropertyName);
|
|
if (property != null)
|
|
property.PageToEnd = value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public override object GetProperty(string propertyName)
|
|
{
|
|
object obj = null;
|
|
if (this._propertyValues != null && this._propertyValues.TryGetValue(propertyName, out obj))
|
|
return obj;
|
|
DataProviderMapping dataProviderMapping;
|
|
if (this.Mappings.TryGetValue(propertyName, out dataProviderMapping))
|
|
{
|
|
object defaultValue = dataProviderMapping.DefaultValue;
|
|
if (defaultValue != null)
|
|
{
|
|
obj = defaultValue;
|
|
}
|
|
else
|
|
{
|
|
string propertyTypeName = dataProviderMapping.PropertyTypeName;
|
|
if (propertyTypeName == "String")
|
|
obj = string.Empty;
|
|
else if (propertyTypeName == "Int32")
|
|
obj = 0;
|
|
else if (propertyTypeName == "Int64")
|
|
obj = 0;
|
|
else if (propertyTypeName == "DateTime")
|
|
obj = new DateTime(0L);
|
|
else if (propertyTypeName == "TimeSpan")
|
|
obj = new TimeSpan(0L);
|
|
else if (propertyTypeName == "Guid")
|
|
obj = Guid.Empty;
|
|
else if (propertyTypeName == "Boolean")
|
|
obj = false;
|
|
else if (propertyTypeName == "Double")
|
|
obj = 0.0;
|
|
else if (propertyTypeName == "Single")
|
|
obj = 0.0f;
|
|
}
|
|
}
|
|
if (obj != null)
|
|
{
|
|
this.EnsureValuesDictionary();
|
|
this._propertyValues[propertyName] = obj;
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
public override void SetProperty(string propertyName, object value)
|
|
{
|
|
if (!this.EnsureValuesDictionary() && this._propertyValues.ContainsKey(propertyName) && Equals(this._propertyValues[propertyName], value))
|
|
return;
|
|
this._propertyValues[propertyName] = value;
|
|
this.FirePropertyChanged(propertyName);
|
|
}
|
|
|
|
public virtual void GetMediaIdAndType(out int mediaId, out EMediaTypes mediaType)
|
|
{
|
|
object property = this.GetProperty("LibraryId");
|
|
mediaId = property == null ? -1 : (int)property;
|
|
mediaType = NameToMediaType(this.TypeName);
|
|
}
|
|
|
|
public static EMediaTypes NameToMediaType(string typeName)
|
|
{
|
|
if (typeName == "ProfileData")
|
|
return EMediaTypes.eMediaTypeUserCard;
|
|
if (typeName == "Track" || typeName == "PlaylistTrack" || (typeName == "ProfileTrack" || typeName == "TrackDownloadHistory") || (typeName == "TrackPurchaseHistory" || typeName == "ChannelTrack"))
|
|
return EMediaTypes.eMediaTypeAudio;
|
|
if (typeName == "Album")
|
|
return EMediaTypes.eMediaTypeAudioAlbum;
|
|
if (typeName == "PodcastSeries")
|
|
return EMediaTypes.eMediaTypePodcastSeries;
|
|
return typeName == "MusicVideo" ? EMediaTypes.eMediaTypeVideo : EMediaTypes.eMediaTypeInvalid;
|
|
}
|
|
|
|
private bool EnsureValuesDictionary()
|
|
{
|
|
if (this._propertyValues != null)
|
|
return false;
|
|
this._propertyValues = new Dictionary<string, object>();
|
|
return true;
|
|
}
|
|
|
|
internal void SetPropertyFromStringValue(
|
|
DataProviderMapping propertyMapping,
|
|
string stringValue)
|
|
{
|
|
object obj = stringValue;
|
|
string propertyName = propertyMapping.PropertyName;
|
|
string propertyTypeName = propertyMapping.PropertyTypeName;
|
|
try
|
|
{
|
|
if (propertyTypeName == "Int32")
|
|
obj = int.Parse(stringValue);
|
|
else if (propertyTypeName == "Int64")
|
|
obj = long.Parse(stringValue);
|
|
else if (propertyTypeName == "TimeSpan")
|
|
obj = XmlConvert.ToTimeSpan(stringValue);
|
|
else if (propertyTypeName == "DateTime")
|
|
obj = XmlConvert.ToDateTime(stringValue, XmlDateTimeSerializationMode.Utc);
|
|
else if (propertyTypeName == "Guid")
|
|
obj = !stringValue.StartsWith(_strUuidPrefix1) ? (!stringValue.StartsWith(_strUuidPrefix2) ? new Guid(stringValue) : (object)new Guid(stringValue.Substring(_strUuidPrefix2.Length))) : new Guid(stringValue.Substring(_strUuidPrefix1.Length));
|
|
else if (propertyTypeName == "Boolean")
|
|
obj = bool.Parse(stringValue);
|
|
else if (propertyTypeName == "Double")
|
|
obj = double.Parse(stringValue, CultureInfo.InvariantCulture);
|
|
else if (propertyTypeName == "Single")
|
|
obj = float.Parse(stringValue, CultureInfo.InvariantCulture);
|
|
else if (propertyTypeName != "String")
|
|
obj = null;
|
|
this.SetProperty(propertyName, obj);
|
|
}
|
|
catch (FormatException ex)
|
|
{
|
|
int num = TraceSwitches.DataProviderSwitch.TraceError ? 1 : 0;
|
|
}
|
|
}
|
|
|
|
private bool IsXmlValueType(string propertyType) => propertyType == "String" || propertyType == "Int32" || (propertyType == "Int64" || propertyType == "TimeSpan") || (propertyType == "DateTime" || propertyType == "Guid" || (propertyType == "Boolean" || propertyType == "Double")) || propertyType == "Single";
|
|
|
|
public bool ProcessXPath(
|
|
string currentXPath,
|
|
Hashtable attributes,
|
|
List<XmlDataProviderQuery.XPathMatch> matches)
|
|
{
|
|
bool flag1 = false;
|
|
foreach (DataProviderMapping propertyMapping in Mappings.Values)
|
|
{
|
|
string tailXPath;
|
|
string matchingAttributeName;
|
|
if (propertyMapping.Source != null && MatchesXPath(currentXPath, attributes, propertyMapping.Source, out tailXPath, out matchingAttributeName))
|
|
{
|
|
string propertyTypeName = propertyMapping.PropertyTypeName;
|
|
bool flag2 = string.IsNullOrEmpty(tailXPath);
|
|
bool flag3 = !flag2 && (tailXPath.StartsWith("/") || tailXPath.StartsWith("@"));
|
|
bool flag4 = flag2 || flag3;
|
|
bool encodedXml = flag2 && propertyMapping.Target == "Xml";
|
|
if (flag2 && (this.IsXmlValueType(propertyTypeName) || encodedXml))
|
|
{
|
|
int num = TraceSwitches.DataProviderSwitch.TraceVerbose ? 1 : 0;
|
|
matches.Add(new XmlDataProviderQuery.XPathMatch(this, propertyMapping, matchingAttributeName, encodedXml));
|
|
flag1 = true;
|
|
}
|
|
else if (flag4 && propertyTypeName == "List")
|
|
{
|
|
IXmlDataProviderObject property = (IXmlDataProviderObject)this.GetProperty(propertyMapping.PropertyName);
|
|
int num = TraceSwitches.DataProviderSwitch.TraceVerbose ? 1 : 0;
|
|
flag1 |= property.ProcessXPath(tailXPath, attributes, matches);
|
|
if (!TraceSwitches.DataProviderSwitch.TraceVerbose)
|
|
;
|
|
}
|
|
else if (flag3)
|
|
{
|
|
int num1 = TraceSwitches.DataProviderSwitch.TraceVerbose ? 1 : 0;
|
|
if (this.GetProperty(propertyMapping.PropertyName) is XmlDataProviderObject property)
|
|
flag1 |= property.ProcessXPath(tailXPath, attributes, matches);
|
|
int num2 = TraceSwitches.DataProviderSwitch.TraceVerbose ? 1 : 0;
|
|
}
|
|
}
|
|
}
|
|
int num3 = flag1 ? 1 : 0;
|
|
return flag1;
|
|
}
|
|
|
|
internal void TransferToAppThread()
|
|
{
|
|
if (this._propertyValues == null)
|
|
return;
|
|
foreach (object obj in this._propertyValues.Values)
|
|
{
|
|
if (obj is XmlDataProviderObject dataProviderObject)
|
|
dataProviderObject.TransferToAppThread();
|
|
else if (obj is XmlDataVirtualList xmlDataVirtualList)
|
|
xmlDataVirtualList.TransferToAppThread();
|
|
}
|
|
}
|
|
|
|
internal void OnQueryComplete()
|
|
{
|
|
if (this._propertyValues == null)
|
|
return;
|
|
foreach (object obj in this._propertyValues.Values)
|
|
{
|
|
if (obj is XmlDataVirtualList xmlDataVirtualList)
|
|
xmlDataVirtualList.OnQueryComplete();
|
|
}
|
|
}
|
|
|
|
internal static bool MatchesXPath(
|
|
string xpathCheck,
|
|
Hashtable attributes,
|
|
string scriptSource,
|
|
out string tailXPath,
|
|
out string matchingAttributeName)
|
|
{
|
|
tailXPath = string.Empty;
|
|
matchingAttributeName = null;
|
|
string sourceXPath;
|
|
string condAttrName;
|
|
string condAttrValue;
|
|
if (!SplitScriptSource(scriptSource, out sourceXPath, out condAttrName, out condAttrValue) || condAttrName != null && (!(attributes[condAttrName] is string attribute) || condAttrValue != attribute) || (!xpathCheck.StartsWith(sourceXPath) || xpathCheck.Length > sourceXPath.Length && xpathCheck[sourceXPath.Length] != '/' && xpathCheck[sourceXPath.Length] != '@'))
|
|
return false;
|
|
int num = sourceXPath.IndexOf('@');
|
|
if (num >= 0)
|
|
{
|
|
tailXPath = xpathCheck.Substring(sourceXPath.Length);
|
|
matchingAttributeName = sourceXPath.Substring(num + 1);
|
|
}
|
|
else if (xpathCheck.Length > sourceXPath.Length)
|
|
tailXPath = xpathCheck.Substring(sourceXPath.Length);
|
|
return true;
|
|
}
|
|
|
|
private static bool SplitScriptSource(
|
|
string scriptSource,
|
|
out string sourceXPath,
|
|
out string condAttrName,
|
|
out string condAttrValue)
|
|
{
|
|
sourceXPath = scriptSource;
|
|
condAttrName = null;
|
|
condAttrValue = null;
|
|
int length1 = scriptSource.IndexOf('[');
|
|
if (length1 < 0)
|
|
return true;
|
|
int num = scriptSource.IndexOf(']', length1 + 1);
|
|
if (length1 == 0 || num < 0 || num != scriptSource.Length - 1)
|
|
return false;
|
|
sourceXPath = scriptSource.Substring(0, length1).Trim();
|
|
string str1 = scriptSource.Substring(length1 + 1, num - (length1 + 1)).Trim();
|
|
if (str1.Length == 0 || str1[0] != '@')
|
|
return false;
|
|
string str2 = str1.Substring(1);
|
|
int length2 = str2.IndexOf('=');
|
|
if (length2 == 0)
|
|
return false;
|
|
if (length2 < 0)
|
|
{
|
|
condAttrName = str2;
|
|
}
|
|
else
|
|
{
|
|
condAttrName = str2.Substring(0, length2).Trim();
|
|
if (str2.Length < length2 + 2)
|
|
return false;
|
|
condAttrValue = str2.Substring(length2 + 2, str2.Length - (length2 + 2) - 1).Trim();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
internal void ChangeListSort(string newSortBy)
|
|
{
|
|
if (this._propertyValues == null)
|
|
return;
|
|
foreach (object obj in this._propertyValues.Values)
|
|
{
|
|
if (obj is XmlDataVirtualList xmlDataVirtualList)
|
|
xmlDataVirtualList.SortBy = newSortBy;
|
|
}
|
|
}
|
|
}
|
|
}
|