mirror of
https://github.com/ZuneDev/ZuneShell.dll.git
synced 2026-07-27 13:11:51 -07:00
268 lines
5.2 KiB
C#
268 lines
5.2 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Reflection;
|
|
using System.Runtime.InteropServices;
|
|
using Microsoft.Iris;
|
|
|
|
namespace MicrosoftZuneLibrary
|
|
{
|
|
[DefaultMember("Item")]
|
|
public class VirtualDatabaseList : VirtualList, IQueryListEvents, IDisposable
|
|
{
|
|
protected int m_QueryRN;
|
|
|
|
protected ZuneQueryList m_pQueryList;
|
|
|
|
protected bool m_fInBulkEvents;
|
|
|
|
protected bool m_fDisposed;
|
|
|
|
protected ArrayList m_lNotifyData;
|
|
|
|
protected int m_blockChangesFlags;
|
|
|
|
protected bool m_fBlockChanges;
|
|
|
|
protected bool m_fEndBulkArrivedDuringBlock;
|
|
|
|
protected bool m_fItemsAdded;
|
|
|
|
internal VirtualDatabaseList(ZuneQueryList pQueryList, [MarshalAs(UnmanagedType.U1)] bool enableSlowDataRequests)
|
|
: base(enableSlowDataRequests)
|
|
{
|
|
try
|
|
{
|
|
m_pQueryList = pQueryList;
|
|
m_lNotifyData = new ArrayList();
|
|
m_fDisposed = false;
|
|
m_fItemsAdded = false;
|
|
}
|
|
catch
|
|
{
|
|
//try-fault
|
|
((IDisposable)this).Dispose();
|
|
throw;
|
|
}
|
|
}
|
|
|
|
private void _007EVirtualDatabaseList()
|
|
{
|
|
m_fDisposed = true;
|
|
}
|
|
|
|
public virtual void ListInsert(int index)
|
|
{
|
|
if (m_fInBulkEvents)
|
|
{
|
|
ListNotifyData listNotifyData = new ListNotifyData();
|
|
listNotifyData.type = 0;
|
|
listNotifyData.pos = index;
|
|
m_lNotifyData.Add(listNotifyData);
|
|
}
|
|
else
|
|
{
|
|
Application.DeferredInvoke(DeferredInsert, index);
|
|
}
|
|
}
|
|
|
|
public virtual void ListRemoveAt(int index)
|
|
{
|
|
if (m_fInBulkEvents)
|
|
{
|
|
ListNotifyData listNotifyData = new ListNotifyData();
|
|
listNotifyData.type = 1;
|
|
listNotifyData.pos = index;
|
|
m_lNotifyData.Add(listNotifyData);
|
|
}
|
|
else
|
|
{
|
|
Application.DeferredInvoke(DeferredRemoveAt, index);
|
|
}
|
|
}
|
|
|
|
public virtual void ListModified(int index)
|
|
{
|
|
if (m_fInBulkEvents)
|
|
{
|
|
ListNotifyData listNotifyData = new ListNotifyData();
|
|
listNotifyData.type = 2;
|
|
listNotifyData.pos = index;
|
|
m_lNotifyData.Add(listNotifyData);
|
|
}
|
|
else
|
|
{
|
|
Application.DeferredInvoke(DeferredModified, index);
|
|
}
|
|
}
|
|
|
|
public virtual void ListBeginBulkEvents()
|
|
{
|
|
m_fInBulkEvents = true;
|
|
}
|
|
|
|
public virtual void ListEndBulkEvents()
|
|
{
|
|
m_fInBulkEvents = false;
|
|
m_fItemsAdded = false;
|
|
Application.DeferredInvoke(DeferredEndBulkEvents, null);
|
|
}
|
|
|
|
public virtual void ListNotifyCount(uint count)
|
|
{
|
|
Application.DeferredInvoke(DeferredCountChange, (int)count);
|
|
}
|
|
|
|
public void SetBlockChangesFlag(int flag, [MarshalAs(UnmanagedType.U1)] bool block)
|
|
{
|
|
if (block)
|
|
{
|
|
m_blockChangesFlags |= flag;
|
|
}
|
|
else
|
|
{
|
|
m_blockChangesFlags &= ~flag;
|
|
}
|
|
byte blockChanges = (byte)((m_blockChangesFlags != 0) ? 1 : 0);
|
|
BlockListChanges(blockChanges != 0);
|
|
}
|
|
|
|
public int GetQueryRN()
|
|
{
|
|
return m_QueryRN;
|
|
}
|
|
|
|
protected virtual void InvalidateItem(int index)
|
|
{
|
|
Modified(index);
|
|
}
|
|
|
|
private unsafe void DeferredEndBulkEvents(object P_0)
|
|
{
|
|
//IL_0062: Expected I, but got I8
|
|
//IL_00f8: Expected I, but got I8
|
|
if (m_fDisposed)
|
|
{
|
|
m_lNotifyData.Clear();
|
|
return;
|
|
}
|
|
if (m_fBlockChanges)
|
|
{
|
|
m_fEndBulkArrivedDuringBlock = true;
|
|
return;
|
|
}
|
|
if (m_fItemsAdded)
|
|
{
|
|
m_lNotifyData.Clear();
|
|
m_pQueryList.EndBulkEventsComplete(fAbandon: true);
|
|
m_fItemsAdded = false;
|
|
return;
|
|
}
|
|
bool flag = false;
|
|
ZuneDBApi.Module.PERFTRACE_COLLECTIONEVENT((_COLLECTION_EVENT)14, null);
|
|
foreach (ListNotifyData lNotifyDatum in m_lNotifyData)
|
|
{
|
|
if (!m_fDisposed)
|
|
{
|
|
switch (lNotifyDatum.type)
|
|
{
|
|
case 2:
|
|
DeferredModified(lNotifyDatum.pos);
|
|
break;
|
|
case 1:
|
|
DeferredRemoveAt(lNotifyDatum.pos);
|
|
flag = true;
|
|
break;
|
|
case 0:
|
|
DeferredInsert(lNotifyDatum.pos);
|
|
flag = true;
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
ZuneDBApi.Module.PERFTRACE_COLLECTIONEVENT((_COLLECTION_EVENT)15, null);
|
|
m_lNotifyData.Clear();
|
|
m_pQueryList.EndBulkEventsComplete(fAbandon: false);
|
|
if (flag)
|
|
{
|
|
m_QueryRN++;
|
|
}
|
|
}
|
|
|
|
private void DeferredInsert(object args)
|
|
{
|
|
if (!m_fDisposed && Count > (int)args)
|
|
{
|
|
Insert((int)args);
|
|
}
|
|
}
|
|
|
|
private void DeferredRemoveAt(object args)
|
|
{
|
|
if (!m_fDisposed && Count > 0 && Count > (int)args)
|
|
{
|
|
RemoveAt((int)args);
|
|
}
|
|
}
|
|
|
|
private void DeferredModified(object args)
|
|
{
|
|
if (!m_fDisposed && Count > (int)args && IsItemAvailable((int)args))
|
|
{
|
|
InvalidateItem((int)args);
|
|
}
|
|
}
|
|
|
|
private void DeferredCountChange(object args)
|
|
{
|
|
int num = (int)args;
|
|
if (!m_fDisposed)
|
|
{
|
|
if (num > Count)
|
|
{
|
|
AddRange(num - Count);
|
|
}
|
|
else
|
|
{
|
|
Count = num;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void BlockListChanges([MarshalAs(UnmanagedType.U1)] bool blockChanges)
|
|
{
|
|
if (m_fBlockChanges != blockChanges)
|
|
{
|
|
m_fBlockChanges = blockChanges;
|
|
if (!blockChanges && m_fEndBulkArrivedDuringBlock)
|
|
{
|
|
DeferredEndBulkEvents(null);
|
|
m_fEndBulkArrivedDuringBlock = false;
|
|
}
|
|
m_pQueryList.ClientBusy(blockChanges);
|
|
}
|
|
}
|
|
|
|
protected virtual void Dispose([MarshalAs(UnmanagedType.U1)] bool P_0)
|
|
{
|
|
if (P_0)
|
|
{
|
|
try
|
|
{
|
|
_007EVirtualDatabaseList();
|
|
}
|
|
finally
|
|
{
|
|
base.Dispose();
|
|
}
|
|
}
|
|
}
|
|
|
|
public new void Dispose()
|
|
{
|
|
Dispose(true);
|
|
}
|
|
}
|
|
}
|