FileIO
using kCura.EDDS.WebAPI.FileIOBase;
using kCura.WinEDDS.Service.Replacement;
using Microsoft.VisualBasic.CompilerServices;
using Relativity.DataExchange;
using Relativity.DataExchange.Service;
using System;
using System.Collections.Specialized;
using System.Net;
using System.Runtime.Caching;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Web.Services.Protocols;
using System.Xml;
using System.Xml.Serialization;
namespace kCura.WinEDDS.Service
{
public class FileIO : kCura.EDDS.WebAPI.FileIOBase.FileIO, IFileIO
{
[Serializable]
public class CustomException : Exception
{
public CustomException(string message, Exception innerException)
: base(message, innerException)
{
}
protected CustomException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
public override string ToString()
{
if (base.InnerException != null)
return base.ToString() + "\r\n" + base.InnerException.ToString();
return base.ToString();
}
}
[CompilerGenerated]
internal sealed class _Closure$__10-0
{
public int $VB$Local_caseContextArtifactID;
public string $VB$Local_documentDirectory;
public string $VB$Local_fileName;
public FileIO $VB$Me;
internal void _Lambda$__0()
{
((kCura.EDDS.WebAPI.FileIOBase.FileIO)$VB$Me).RemoveFill($VB$Local_caseContextArtifactID, $VB$Local_documentDirectory, $VB$Local_fileName);
}
}
[CompilerGenerated]
internal sealed class _Closure$__11-0
{
public int $VB$Local_caseContextArtifactID;
public string $VB$Local_fileName;
public FileIO $VB$Me;
internal void _Lambda$__0()
{
((kCura.EDDS.WebAPI.FileIOBase.FileIO)$VB$Me).RemoveTempFile($VB$Local_caseContextArtifactID, $VB$Local_fileName);
}
}
[CompilerGenerated]
internal sealed class _Closure$__12-0
{
public int $VB$Local_appID;
public FileIO $VB$Me;
internal bool _Lambda$__0()
{
return ((kCura.EDDS.WebAPI.FileIOBase.FileIO)$VB$Me).ValidateBcpShare($VB$Local_appID);
}
}
[CompilerGenerated]
internal sealed class _Closure$__13-0
{
public int $VB$Local_appID;
public FileIO $VB$Me;
internal string[][] _Lambda$__0()
{
return ((kCura.EDDS.WebAPI.FileIOBase.FileIO)$VB$Me).GetBcpShareSpaceReport($VB$Local_appID);
}
}
[CompilerGenerated]
internal sealed class _Closure$__14-0
{
public int $VB$Local_appID;
public FileIO $VB$Me;
internal string[][] _Lambda$__0()
{
return ((kCura.EDDS.WebAPI.FileIOBase.FileIO)$VB$Me).GetDefaultRepositorySpaceReport($VB$Local_appID);
}
}
[CompilerGenerated]
internal sealed class _Closure$__7-0
{
public Action $VB$Local_f;
internal bool _Lambda$__0()
{
$VB$Local_f();
return true;
}
}
[CompilerGenerated]
internal sealed class _Closure$__8-0
{
public int $VB$Local_caseContextArtifactID;
public byte[] $VB$Local_b;
public string $VB$Local_documentDirectory;
public string $VB$Local_fileGuid;
public FileIO $VB$Me;
internal IoResponse _Lambda$__0()
{
return ((kCura.EDDS.WebAPI.FileIOBase.FileIO)$VB$Me).BeginFill($VB$Local_caseContextArtifactID, $VB$Local_b, $VB$Local_documentDirectory, $VB$Local_fileGuid);
}
}
[CompilerGenerated]
internal sealed class _Closure$__9-0
{
public int $VB$Local_caseContextArtifactID;
public string $VB$Local_documentDirectory;
public string $VB$Local_fileName;
public byte[] $VB$Local_b;
public FileIO $VB$Me;
internal IoResponse _Lambda$__0()
{
return ((kCura.EDDS.WebAPI.FileIOBase.FileIO)$VB$Me).FileFill($VB$Local_caseContextArtifactID, $VB$Local_documentDirectory, $VB$Local_fileName, $VB$Local_b);
}
}
private static MemoryCache BCPCache = new MemoryCache("BCPCache", (NameValueCollection)null);
public FileIO(ICredentials credentials, CookieContainer cookieContainer)
{
this.set_Credentials(credentials);
this.set_CookieContainer(cookieContainer);
base.Url = $"{AppSettings.Instance.WebApiServiceUrl}""";
this.set_Timeout(Settings.DefaultTimeOut);
}
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest obj = (HttpWebRequest)this.GetWebRequest(uri);
obj.UnsafeAuthenticatedConnectionSharing = true;
obj.Credentials = this.get_Credentials();
return obj;
}
private bool IsRetryableException(Exception ex)
{
bool result = false;
if (ex is SoapException && ex.ToString().IndexOf("NeedToReLoginException") != -1)
result = true;
else if (Operators.CompareString(ex.Message, "The server committed a protocol violation. Section=ResponseStatusLine", false) == 0) {
result = true;
}
return result;
}
private T ExecuteWithRetry<T>(Func<T> f)
{
int num = 0;
while (num < AppSettings.Instance.MaxReloginTries) {
num = checked(num + 1);
try {
return f();
} catch (Exception ex) {
ProjectData.SetProjectError(ex);
Exception ex2 = ex;
if (!IsRetryableException(ex2) || num >= AppSettings.Instance.MaxReloginTries) {
Exception ex3 = ConvertExpectedSoapExceptionToRelativityException(ex2);
if (ex3 != null)
throw ex3;
throw;
}
Helper.AttemptReLogin(this.get_Credentials(), this.get_CookieContainer(), num, true);
ProjectData.ClearProjectError();
}
}
return default(T);
}
public Exception ConvertExpectedSoapExceptionToRelativityException(Exception ex)
{
SoapException val = ex as SoapException;
if (val != null) {
Exception result = null;
try {
if (Operators.CompareString(val.get_Detail().SelectNodes("ExceptionType").Item(0)
.InnerText, "Relativity.Core.Exception.InsufficientAccessControlListPermissions", false) == 0)
result = new BulkImportManager.InsufficientPermissionsForImportException(val.get_Detail().SelectNodes("ExceptionMessage")[0].InnerText);
else if (Operators.CompareString(val.get_Detail().SelectNodes("ExceptionType").Item(0)
.InnerText, "System.ArgumentException", false) == 0) {
result = new ArgumentException(val.get_Detail().SelectNodes("ExceptionMessage")[0].InnerText);
}
} catch (Exception projectError) {
ProjectData.SetProjectError(projectError);
ProjectData.ClearProjectError();
}
return result;
}
return null;
}
private void ExecuteWithRetry(Action f)
{
ExecuteWithRetry(delegate {
f();
return true;
});
}
public new IoResponse BeginFill(int caseContextArtifactID, byte[] b, string documentDirectory, string fileGuid)
{
return ExecuteWithRetry(() => base.BeginFill(caseContextArtifactID, b, documentDirectory, fileGuid));
}
public new IoResponse FileFill(int caseContextArtifactID, string documentDirectory, string fileName, byte[] b)
{
return ExecuteWithRetry(() => base.FileFill(caseContextArtifactID, documentDirectory, fileName, b));
}
public new void RemoveFill(int caseContextArtifactID, string documentDirectory, string fileName)
{
ExecuteWithRetry(delegate {
base.RemoveFill(caseContextArtifactID, documentDirectory, fileName);
});
}
public new void RemoveTempFile(int caseContextArtifactID, string fileName)
{
ExecuteWithRetry(delegate {
base.RemoveTempFile(caseContextArtifactID, fileName);
});
}
void IFileIO.RemoveTempFile(int caseContextArtifactID, string fileName)
{
this.RemoveTempFile(caseContextArtifactID, fileName);
}
public new bool (int appID)
{
return ExecuteWithRetry(() => base.ValidateBcpShare(appID));
}
bool IFileIO.ValidateBcpShare(int appID)
{
return this.ValidateBcpShare(appID);
}
public new string[][] (int appID)
{
return ExecuteWithRetry(() => base.GetBcpShareSpaceReport(appID));
}
string[][] IFileIO.GetBcpShareSpaceReport(int appID)
{
return this.GetBcpShareSpaceReport(appID);
}
public new string[][] GetDefaultRepositorySpaceReport(int appID)
{
return ExecuteWithRetry(() => base.GetDefaultRepositorySpaceReport(appID));
}
public new int RepositoryVolumeMax()
{
return ExecuteWithRetry(() => base.RepositoryVolumeMax());
}
int IFileIO.RepositoryVolumeMax()
{
return this.RepositoryVolumeMax();
}
public new string (int appID)
{
object objectValue = RuntimeHelpers.GetObjectValue(BCPCache.Get(appID.ToString(), (string)null));
if (objectValue == null) {
int num = 0;
while (num < AppSettings.Instance.MaxReloginTries) {
num = checked(num + 1);
try {
string bcpSharePath = base.GetBcpSharePath(appID);
if (!string.IsNullOrEmpty(bcpSharePath)) {
MemoryCache bCPCache = BCPCache;
string text = appID.ToString();
string text2 = bcpSharePath;
CacheItemPolicy val = new CacheItemPolicy();
val.set_AbsoluteExpiration(DateTimeOffset.UtcNow.AddSeconds(60));
bCPCache.Add(text, (object)text2, val, (string)null);
return bcpSharePath;
}
Helper.AttemptReLogin(this.get_Credentials(), this.get_CookieContainer(), num, true);
} catch (Exception ex) {
ProjectData.SetProjectError(ex);
Exception ex2 = ex;
if (!(ex2 is SoapException) || ex2.ToString().IndexOf("NeedToReLoginException") == -1 || num >= AppSettings.Instance.MaxReloginTries) {
if (ex2 is SoapException)
throw ParseExceptionForMoreInfo(ex2);
throw;
}
Helper.AttemptReLogin(this.get_Credentials(), this.get_CookieContainer(), num, true);
ProjectData.ClearProjectError();
}
}
throw new Exception("Unable to retrieve BCP share path from the server");
}
return objectValue.ToString();
}
string IFileIO.GetBcpSharePath(int appID)
{
return this.GetBcpSharePath(appID);
}
public static Exception ParseExceptionForMoreInfo(Exception ex)
{
Exception result = ex;
SoapExceptionDetail soapExceptionDetail = null;
if (ex is SoapException) {
SoapException val = ex;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(SoapExceptionDetail));
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(val.get_Detail().OuterXml);
XmlReader xmlReader = xmlDocument.CreateNavigator().ReadSubtree();
soapExceptionDetail = (xmlSerializer.Deserialize(xmlReader) as SoapExceptionDetail);
}
if (soapExceptionDetail != null)
result = new CustomException(soapExceptionDetail.ExceptionMessage, ex);
return result;
}
[CompilerGenerated]
private int _Lambda$__15-0()
{
return base.RepositoryVolumeMax();
}
}
}