UpdateConfigHost
using System.Collections.Specialized;
using System.Configuration.Internal;
using System.IO;
namespace System.Configuration
{
internal sealed class UpdateConfigHost : DelegatingConfigHost
{
private HybridDictionary _streams;
internal UpdateConfigHost(IInternalConfigHost host)
{
base.Host = host;
}
internal void AddStreamname(string oldStreamname, string newStreamname, bool alwaysIntercept)
{
if (!string.IsNullOrEmpty(oldStreamname) && (alwaysIntercept || !StringUtil.EqualsIgnoreCase(oldStreamname, newStreamname))) {
if (_streams == null)
_streams = new HybridDictionary(true);
_streams[oldStreamname] = new StreamUpdate(newStreamname);
}
}
internal string GetNewStreamname(string oldStreamname)
{
StreamUpdate streamUpdate = GetStreamUpdate(oldStreamname, false);
if (streamUpdate == null)
return oldStreamname;
return streamUpdate.NewStreamname;
}
private StreamUpdate GetStreamUpdate(string oldStreamname, bool alwaysIntercept)
{
if (_streams == null)
return null;
StreamUpdate streamUpdate = (StreamUpdate)_streams[oldStreamname];
if (streamUpdate != null && !alwaysIntercept && !streamUpdate.WriteCompleted)
streamUpdate = null;
return streamUpdate;
}
public override object GetStreamVersion(string streamName)
{
StreamUpdate streamUpdate = GetStreamUpdate(streamName, false);
if (streamUpdate == null)
return base.Host.GetStreamVersion(streamName);
return InternalConfigHost.StaticGetStreamVersion(streamUpdate.NewStreamname);
}
public override Stream OpenStreamForRead(string streamName)
{
StreamUpdate streamUpdate = GetStreamUpdate(streamName, false);
if (streamUpdate == null)
return base.Host.OpenStreamForRead(streamName);
return InternalConfigHost.StaticOpenStreamForRead(streamUpdate.NewStreamname);
}
public override Stream OpenStreamForWrite(string streamName, string templateStreamName, ref object writeContext)
{
StreamUpdate streamUpdate = GetStreamUpdate(streamName, true);
if (streamUpdate != null)
return InternalConfigHost.StaticOpenStreamForWrite(streamUpdate.NewStreamname, templateStreamName, ref writeContext);
return base.Host.OpenStreamForWrite(streamName, templateStreamName, ref writeContext);
}
public override void WriteCompleted(string streamName, bool success, object writeContext)
{
StreamUpdate streamUpdate = GetStreamUpdate(streamName, true);
if (streamUpdate != null) {
InternalConfigHost.StaticWriteCompleted(streamUpdate.NewStreamname, success, writeContext);
if (success)
streamUpdate.WriteCompleted = true;
} else
base.Host.WriteCompleted(streamName, success, writeContext);
}
public override bool IsConfigRecordRequired(string configPath)
{
return true;
}
public override void DeleteStream(string streamName)
{
StreamUpdate streamUpdate = GetStreamUpdate(streamName, false);
if (streamUpdate != null)
InternalConfigHost.StaticDeleteStream(streamUpdate.NewStreamname);
else
base.Host.DeleteStream(streamName);
}
public override bool IsFile(string streamName)
{
StreamUpdate streamUpdate = GetStreamUpdate(streamName, false);
if (streamUpdate == null)
return base.Host.IsFile(streamName);
return InternalConfigHost.StaticIsFile(streamUpdate.NewStreamname);
}
}
}