<PackageReference Include="Relativity.Server.Import.SDK" Version="2.9.2" />

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; } } }