LoadFilePreProcessor
using kCura.WinEDDS.Service;
using kCura.WinEDDS.Service.Replacement;
using Microsoft.VisualBasic.CompilerServices;
using Relativity.DataExchange;
using Relativity.DataExchange.Service;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Windows.Forms;
namespace kCura.WinEDDS
{
public class LoadFilePreProcessor : LoadFileReader
{
public enum EventType
{
Begin,
Complete,
Progress,
Cancel
}
public class EventArgs
{
private long _newlinesRead;
private long _bytesRead;
private long _totalBytes;
private long _stepSize;
private EventType _type;
public long NewlinesRead => _newlinesRead;
public long BytesRead => _bytesRead;
public long TotalBytes => _totalBytes;
public long StepSize => _stepSize;
public EventType Type => _type;
public EventArgs(EventType type, long newlines, long bytes, long total, long step)
{
_newlinesRead = newlines;
_bytesRead = bytes;
_totalBytes = total;
_stepSize = step;
_type = type;
}
}
public delegate void OnEventEventHandler (EventArgs e);
public class HaltListener
{
public delegate void StopProcessEventHandler ();
[CompilerGenerated]
private StopProcessEventHandler StopProcessEvent;
public event StopProcessEventHandler StopProcess {
[CompilerGenerated]
add {
StopProcessEventHandler stopProcessEventHandler = StopProcessEvent;
StopProcessEventHandler stopProcessEventHandler2;
do {
stopProcessEventHandler2 = stopProcessEventHandler;
StopProcessEventHandler value2 = (StopProcessEventHandler)Delegate.Combine(stopProcessEventHandler2, value);
stopProcessEventHandler = Interlocked.CompareExchange(ref StopProcessEvent, value2, stopProcessEventHandler2);
} while ((object)stopProcessEventHandler != stopProcessEventHandler2);
}
[CompilerGenerated]
remove {
StopProcessEventHandler stopProcessEventHandler = StopProcessEvent;
StopProcessEventHandler stopProcessEventHandler2;
do {
stopProcessEventHandler2 = stopProcessEventHandler;
StopProcessEventHandler value2 = (StopProcessEventHandler)Delegate.Remove(stopProcessEventHandler2, value);
stopProcessEventHandler = Interlocked.CompareExchange(ref StopProcessEvent, value2, stopProcessEventHandler2);
} while ((object)stopProcessEventHandler != stopProcessEventHandler2);
}
}
public void Halt()
{
StopProcessEvent?.Invoke();
}
}
[Serializable]
[CompilerGenerated]
internal new sealed class _Closure$__
{
public static readonly _Closure$__ $I;
public static Func<LoadFileFieldMap.LoadFileFieldMapItem, bool> $I22-0;
public static Func<LoadFileFieldMap.LoadFileFieldMapItem, bool> $I25-0;
public static Func<LoadFileFieldMap.LoadFileFieldMapItem, bool> $I25-1;
static _Closure$__()
{
$I = new _Closure$__();
}
internal bool _Lambda$__22-0(LoadFileFieldMap.LoadFileFieldMapItem item)
{
if (item.DocumentField != null)
return (item.NativeFileColumnIndex != -1 && item.DocumentField.FieldTypeID == 5) | (item.DocumentField.FieldTypeID == 8);
return false;
}
internal bool _Lambda$__25-0(LoadFileFieldMap.LoadFileFieldMapItem mitem)
{
return (mitem.DocumentField.FieldTypeID == 5) | (mitem.DocumentField.FieldTypeID == 8);
}
internal bool _Lambda$__25-1(LoadFileFieldMap.LoadFileFieldMapItem mitem)
{
return mitem.NativeFileColumnIndex != -1;
}
}
[CompilerGenerated]
[AccessedThroughProperty("_haltListener")]
private HaltListener __haltListener;
private bool _continue;
private HybridDictionary _folders;
private Dictionary<int, Dictionary<string, bool>> _choicesTable;
private ICodeManager _codeManager;
[CompilerGenerated]
private OnEventEventHandler OnEventEvent;
private virtual HaltListener _haltListener {
[CompilerGenerated]
get {
return __haltListener;
}
[MethodImpl(MethodImplOptions.Synchronized)]
[CompilerGenerated]
set {
HaltListener.StopProcessEventHandler obj = _haltListener_StopProcess;
HaltListener _haltListener = __haltListener;
if (_haltListener != null)
_haltListener.StopProcess -= obj;
__haltListener = value;
_haltListener = __haltListener;
if (_haltListener != null)
_haltListener.StopProcess += obj;
}
}
public event OnEventEventHandler OnEvent {
[CompilerGenerated]
add {
OnEventEventHandler onEventEventHandler = OnEventEvent;
OnEventEventHandler onEventEventHandler2;
do {
onEventEventHandler2 = onEventEventHandler;
OnEventEventHandler value2 = (OnEventEventHandler)Delegate.Combine(onEventEventHandler2, value);
onEventEventHandler = Interlocked.CompareExchange(ref OnEventEvent, value2, onEventEventHandler2);
} while ((object)onEventEventHandler != onEventEventHandler2);
}
[CompilerGenerated]
remove {
OnEventEventHandler onEventEventHandler = OnEventEvent;
OnEventEventHandler onEventEventHandler2;
do {
onEventEventHandler2 = onEventEventHandler;
OnEventEventHandler value2 = (OnEventEventHandler)Delegate.Remove(onEventEventHandler2, value);
onEventEventHandler = Interlocked.CompareExchange(ref OnEventEvent, value2, onEventEventHandler2);
} while ((object)onEventEventHandler != onEventEventHandler2);
}
}
protected void ProcessStart(long newlines, long bytes, long total, long step)
{
RaiseOnEvent(EventType.Begin, newlines, bytes, total, step);
}
protected void ProcessProgress(long newlines, long bytes, long total, long step)
{
RaiseOnEvent(EventType.Progress, newlines, bytes, total, step);
}
protected void ProcessComplete(long newlines, long bytes, long total, long step)
{
RaiseOnEvent(EventType.Complete, newlines, bytes, total, step);
}
protected void ProcessCancel(long newlines, long bytes, long total, long step)
{
RaiseOnEvent(EventType.Cancel, newlines, bytes, total, step);
}
protected void RaiseOnEvent(EventType type, long newlines, long bytes, long total, long step)
{
OnEventEvent?.Invoke(new EventArgs(type, newlines, bytes, total, step));
}
public LoadFilePreProcessor(LoadFile args, bool trackErrorsAsFieldValues, Func<string> correlationIdFunc)
: base(args, trackErrorsAsFieldValues, correlationIdFunc, ExecutionSource.Unknown)
{
_choicesTable = new Dictionary<int, Dictionary<string, bool>>();
_haltListener = new HaltListener();
_continue = true;
_folders = new HybridDictionary();
_codeManager = ManagerFactory.CreateCodeManager(args.Credentials, args.CookieContainer, correlationIdFunc);
}
private bool NeedToCheckFolders()
{
if (_settings.ForceFolderPreview && _settings.CreateFolderStructure && _settings.FolderStructureContainedInColumn != null && _artifactTypeID == 10)
return Operators.CompareString(_settings.OverwriteDestination.ToLower(), ((Enum)0).ToString().ToLower(), false) == 0;
return false;
}
private bool NeedToCheckChoices()
{
bool result = false;
if (_fieldMap.Count > 0)
result = _fieldMap.ToArray().Where((_Closure$__.$I22-0 != null) ? _Closure$__.$I22-0 : (_Closure$__.$I22-0 = delegate(LoadFileFieldMap.LoadFileFieldMapItem item) {
if (item.DocumentField != null)
return (item.NativeFileColumnIndex != -1 && item.DocumentField.FieldTypeID == 5) | (item.DocumentField.FieldTypeID == 8);
return false;
})).Any();
return result;
}
public void CountLines()
{
if (NeedToCheckFolders() || NeedToCheckChoices())
ReadFile(_settings.FilePath);
else
ReadFileSimple(_settings.FilePath);
try {
base.Reader.Close();
} catch (Exception projectError) {
ProjectData.SetProjectError(projectError);
ProjectData.ClearProjectError();
}
}
public object ReadFileSimple(string path)
{
EnsureReader();
long length = base.Reader.BaseStream.Length;
long stepSize = GetStepSize(length);
DateTime now = DateTime.Now;
long ticks = now.Ticks;
long num = ticks;
ProcessStart(base.CurrentLineNumber, 0, length, stepSize);
while (!HasReachedEof & _continue) {
now = DateTime.Now;
ticks = now.Ticks;
if (checked(ticks - num) > 10000000) {
num = ticks;
ProcessProgress(base.CurrentLineNumber, base.Reader.BaseStream.Position, length, stepSize);
}
AdvanceLine();
}
ProcessComplete(base.CurrentLineNumber, base.Reader.BaseStream.Position, length, stepSize);
return null;
}
public override object ReadFile(string path)
{
EnsureReader();
long length = base.Reader.BaseStream.Length;
long stepSize = GetStepSize(length);
int columnIndexFromString = GetColumnIndexFromString(_settings.FolderStructureContainedInColumn);
DateTime now = DateTime.Now;
long ticks = now.Ticks;
long num = ticks;
bool flag = false;
bool flag2 = NeedToCheckFolders();
bool flag3 = NeedToCheckChoices();
bool flag4 = true;
ProcessStart(base.CurrentLineNumber, 0, length, stepSize);
_choicesTable.Clear();
foreach (LoadFileFieldMap.LoadFileFieldMapItem item in _fieldMap.ToArray().Where((_Closure$__.$I25-0 != null) ? _Closure$__.$I25-0 : (_Closure$__.$I25-0 = ((LoadFileFieldMap.LoadFileFieldMapItem mitem) => (mitem.DocumentField.FieldTypeID == 5) | (mitem.DocumentField.FieldTypeID == 8)))).Where((_Closure$__.$I25-1 != null) ? _Closure$__.$I25-1 : (_Closure$__.$I25-1 = ((LoadFileFieldMap.LoadFileFieldMapItem mitem) => mitem.NativeFileColumnIndex != -1)))) {
_choicesTable[item.NativeFileColumnIndex] = new Dictionary<string, bool>();
}
checked {
while (!HasReachedEof & _continue) {
if (RecordCount() > AppSettings.Instance.PreviewThreshold) {
AdvanceLine();
now = DateTime.Now;
ticks = now.Ticks;
if (ticks - num > 10000000) {
num = ticks;
ProcessProgress(base.CurrentLineNumber, base.Reader.BaseStream.Position, length, stepSize);
}
} else {
string[] line = GetLine();
if (flag4) {
flag4 = false;
if (_settings.FirstLineContainsHeaders)
continue;
}
if (flag2)
AddFolder(line.GetValue(columnIndexFromString).ToString());
if (flag3) {
foreach (int key2 in _choicesTable.Keys) {
if (line != null && line.Count() >= key2) {
string[] array = line.GetValue(key2).ToString().Split(new char[1] {
';'
});
for (int i = 0; i < array.Length; i++) {
string[] array2 = array[i].Split(new char[1] {
'\\'
});
foreach (string key in array2) {
_choicesTable[key2][key] = true;
}
}
}
}
}
if (RecordCount() == AppSettings.Instance.PreviewThreshold) {
if (!DisplayFolderAndChoiceWarning(flag2, flag3)) {
ProcessCancel(base.CurrentLineNumber, base.Reader.BaseStream.Position, length, stepSize);
return null;
}
flag = true;
}
now = DateTime.Now;
ticks = now.Ticks;
if (ticks - num > 10000000) {
num = ticks;
ProcessProgress(base.CurrentLineNumber, base.Reader.BaseStream.Position, length, stepSize);
}
}
}
if ((_continue & !flag) && !DisplayFolderAndChoiceWarning(flag2, flag3)) {
ProcessCancel(base.CurrentLineNumber, base.Reader.BaseStream.Position, length, stepSize);
return null;
}
ProcessComplete(base.CurrentLineNumber, base.Reader.BaseStream.Position, length, stepSize);
return null;
}
}
private bool DisplayFolderAndChoiceWarning(bool checkFolders, bool checkChoices)
{
int choiceLimitForUI = default(int);
if (checkChoices)
choiceLimitForUI = _codeManager.GetChoiceLimitForUI();
bool flag = checkFolders && GetFolderCount() > 0;
bool flag2 = checkChoices && GetMaxChoiceCount() > choiceLimitForUI;
if (!(flag | flag2))
return true;
if ((int)MessageBox.Show(BuildImportWarningMessage(RecordCount(), flag, GetFolderCount(), flag2, GetMaxChoiceCount()), "Relativity Desktop Client", 1) == 1)
return true;
return false;
}
private string BuildImportWarningMessage(int recordCount, bool reportFolders, int numOfFolders, bool reportChoices, int numOfChoices)
{
List<string> list = new List<string>();
if (reportFolders)
list.Add($"{numOfFolders}""");
if (reportChoices)
list.Add($"{numOfChoices}""");
string arg = string.Join(" and ", list.ToArray());
return $"""{recordCount}""{arg}""";
}
private int RecordCount()
{
if (!_settings.FirstLineContainsHeaders)
return base.CurrentLineNumber;
return checked(base.CurrentLineNumber - 1);
}
private int GetFolderCount()
{
return _folders.Count;
}
private int GetMaxChoiceCount()
{
int num = 0;
foreach (int key in _choicesTable.Keys) {
int count = _choicesTable[key].Keys.Count;
num = Math.Max(num, count);
}
return num;
}
private int GetColumnIndexFromString(string pathColumn)
{
int result = -1;
checked {
if (pathColumn != null) {
int num = pathColumn.LastIndexOf('(') + 1;
int num2 = pathColumn.LastIndexOf(')');
result = int.Parse(pathColumn.Substring(num, num2 - num)) - 1;
}
return result;
}
}
private void AddFolder(string folderpath)
{
if (Operators.CompareString(folderpath, "", false) != 0 && Operators.CompareString(folderpath, "\\", false) != 0) {
if (folderpath.LastIndexOf('\\') < 1) {
if (!_folders.Contains(folderpath))
_folders.Add(folderpath, "");
} else {
if (!_folders.Contains(folderpath))
_folders.Add(folderpath, "");
AddFolder(folderpath.Substring(0, folderpath.LastIndexOf('\\')));
}
}
}
private long GetStepSize(long value)
{
checked {
return (long)Math.Round(unchecked((double)value / 100));
}
}
public void StopCounting()
{
_haltListener.Halt();
}
private void _haltListener_StopProcess()
{
_continue = false;
}
}
}