Files
ZuneShell.dll/ZuneDBApi/MicrosoftZuneLibrary/FriendsOfArtistQuery.cs
T

271 lines
8.2 KiB
C#
Raw Normal View History

2021-11-11 11:18:46 -06:00
using System;
using System.Collections;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Threading;
using _003CCppImplementationDetails_003E;
using Microsoft.Iris;
namespace MicrosoftZuneLibrary
{
public class FriendsOfArtistQuery : ModelItem, IDisposable
{
private Guid m_artistId;
private bool m_getFriends;
private int m_userId;
private bool m_resolveZuneTags;
private bool m_hasFriends = false;
private bool m_queryComplete = false;
private IList m_friends = null;
private IList m_friendsWithFavs = null;
private IList m_friendsWithMostPlayedSongs = null;
private IList m_friendsWithMostPlayedArtists = null;
private static FriendsOfArtistQuery m_singletonInstance = null;
public IList FriendsWithMostPlayedArtists => m_friendsWithMostPlayedArtists;
public IList FriendsWithMostPlayedSongs => m_friendsWithMostPlayedSongs;
public IList FriendsWithFavs => m_friendsWithFavs;
public IList Friends => m_friends;
public bool HasFriends
{
[return: MarshalAs(UnmanagedType.U1)]
get
{
return m_hasFriends;
}
}
public bool QueryComplete
{
[return: MarshalAs(UnmanagedType.U1)]
get
{
return m_queryComplete;
}
[param: MarshalAs(UnmanagedType.U1)]
set
{
if (value != m_queryComplete)
{
m_queryComplete = value;
FirePropertyChanged("QueryComplete");
}
}
}
public static FriendsOfArtistQuery Instance
{
get
{
if (m_singletonInstance == null)
{
m_singletonInstance = new FriendsOfArtistQuery();
}
return m_singletonInstance;
}
}
public void Query(Guid artistId, [MarshalAs(UnmanagedType.U1)] bool getFriends, int userId)
{
Query(artistId, getFriends, userId, resolveZuneTags: true);
}
public void Query(Guid artistId, [MarshalAs(UnmanagedType.U1)] bool getFriends, int userId, [MarshalAs(UnmanagedType.U1)] bool resolveZuneTags)
{
try
{
Monitor.Enter(m_singletonInstance);
QueryComplete = false;
if (!(artistId != m_artistId) && (!getFriends || m_getFriends) && userId == m_userId)
{
QueryComplete = true;
return;
}
m_artistId = artistId;
m_getFriends = getFriends;
m_userId = userId;
m_resolveZuneTags = resolveZuneTags;
SetResults(hasFriends: false, null, null, null, null);
if (artistId != Guid.Empty)
{
AsyncQueryParams state = new AsyncQueryParams(artistId, getFriends, userId, DeferredSetResults, m_resolveZuneTags);
ThreadPool.QueueUserWorkItem(AsyncQuery, state);
}
else
{
QueryComplete = true;
}
}
finally
{
Monitor.Exit(m_singletonInstance);
}
}
private FriendsOfArtistQuery()
{
}
private void _007EFriendsOfArtistQuery()
{
}
private unsafe static void AsyncQuery(object obj)
{
//IL_000d: Expected I, but got I8
//IL_0011: Expected I, but got I8
//IL_00d2: Expected I, but got I8
//IL_00f7: Expected I, but got I8
AsyncQueryParams asyncQueryParams = (AsyncQueryParams)obj;
int num = 0;
int* ptr = null;
int* ptr2 = null;
int num2 = ((!asyncQueryParams.GetFriends) ? 1 : 100);
if (_003CModule_003E.ZuneLibraryExports_002EUserCardsForMedia(_003CModule_003E.GuidToGUID(asyncQueryParams.ArtistId), EMediaTypes.eMediaTypePersonArtist, asyncQueryParams.UserId, 14, num2, &num, &ptr, &ptr2) >= 0)
{
bool flag = num > 0;
IList list = null;
IList list2 = null;
IList list3 = null;
IList list4 = null;
if (asyncQueryParams.GetFriends && flag)
{
list = new ArrayList(num);
list2 = new ArrayList(num);
list3 = new ArrayList(num);
list4 = new ArrayList(num);
int num3 = 0;
if (0 < num)
{
long num4 = 0L;
do
{
FriendOfArtist friendOfArtist = new FriendOfArtist();
friendOfArtist.Id = *(int*)(num4 + (nint)ptr);
if (asyncQueryParams.ResolveZuneTags)
{
_0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040 _0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040;
_003CModule_003E.DBPropertyRequestStruct_002E_007Bctor_007D((DBPropertyRequestStruct*)(&_0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040), 187u);
try
{
if (_003CModule_003E.ZuneLibraryExports_002EGetFieldValues(*(int*)(num4 + (nint)ptr), EListType.eUserCardList, 1, (DBPropertyRequestStruct*)(&_0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040), null) >= 0 && System.Runtime.CompilerServices.Unsafe.As<_0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040, int>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset(ref _0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040, 4)) >= 0 && System.Runtime.CompilerServices.Unsafe.As<_0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040, ushort>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset(ref _0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040, 8)) == 8)
{
friendOfArtist.ZuneTag = new string((char*)System.Runtime.CompilerServices.Unsafe.As<_0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040, ulong>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset(ref _0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040, 16)));
}
}
catch
{
//try-fault
_003CModule_003E.___CxxCallUnwindVecDtor((delegate*<void*, ulong, int, delegate*<void*, void>, void>)(&_003CModule_003E.__ehvec_dtor), (void*)(&_0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040), 32uL, 1, (delegate*<void*, void>)(delegate*<DBPropertyRequestStruct*, void>)(&_003CModule_003E.DBPropertyRequestStruct_002E_007Bdtor_007D));
throw;
}
_003CModule_003E.__ehvec_dtor(&_0024ArrayType_0024_0024_0024BY00UDBPropertyRequestStruct_0040_0040, 32uL, 1, (delegate*<void*, void>)(delegate*<DBPropertyRequestStruct*, void>)(&_003CModule_003E.DBPropertyRequestStruct_002E_007Bdtor_007D));
}
list.Add(friendOfArtist);
if (((uint)(*(int*)(num4 + (nint)ptr2)) & 2u) != 0)
{
list2.Add(friendOfArtist);
}
if (((uint)(*(int*)(num4 + (nint)ptr2)) & 4u) != 0)
{
list3.Add(friendOfArtist);
}
if (((uint)(*(int*)(num4 + (nint)ptr2)) & 8u) != 0)
{
list4.Add(friendOfArtist);
}
num3++;
num4 += 4;
}
while (num3 < num);
}
}
SetResultsParams args = new SetResultsParams(flag, list, list2, list3, list4);
Application.DeferredInvoke(asyncQueryParams.SetResultsHandler, args);
}
if (ptr != null)
{
_003CModule_003E.delete_005B_005D(ptr);
}
if (ptr2 != null)
{
_003CModule_003E.delete_005B_005D(ptr2);
}
}
private void SetResults([MarshalAs(UnmanagedType.U1)] bool hasFriends, IList friends, IList friendsWithFavs, IList friendsWithMostPlayedSongs, IList friendsWithMostPlayedArtists)
{
if (m_friends != friends)
{
m_friends = friends;
FirePropertyChanged("Friends");
}
if (m_friendsWithFavs != friendsWithFavs)
{
m_friendsWithFavs = friendsWithFavs;
FirePropertyChanged("FriendsWithFavs");
}
if (m_friendsWithMostPlayedSongs != friendsWithMostPlayedSongs)
{
m_friendsWithMostPlayedSongs = friendsWithMostPlayedSongs;
FirePropertyChanged("FriendsWithMostPlayedSongs");
}
if (m_friendsWithMostPlayedArtists != friendsWithMostPlayedArtists)
{
m_friendsWithMostPlayedArtists = friendsWithMostPlayedArtists;
FirePropertyChanged("FriendsWithMostPlayedArtists");
}
if (m_hasFriends != hasFriends)
{
m_hasFriends = hasFriends;
FirePropertyChanged("HasFriends");
}
}
private void DeferredSetResults(object obj)
{
QueryComplete = true;
SetResultsParams setResultsParams = (SetResultsParams)obj;
SetResults(setResultsParams.HasFriends, setResultsParams.Friends, setResultsParams.FriendsWithFavs, setResultsParams.FriendsWithMostPlayedSongs, setResultsParams.FriendsWithMostPlayedArtists);
}
protected virtual void Dispose([MarshalAs(UnmanagedType.U1)] bool P_0)
{
if (P_0)
{
try
{
}
finally
{
base.Dispose();
}
}
else
{
Finalize();
}
}
public new void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}