Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / DEVDIV / depot / DevDiv / releases / whidbey / QFE / ndp / fx / src / xsp / System / Web / Compilation / TimeStampChecker.cs / 1 / TimeStampChecker.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.Compilation {
using System;
using System.Collections;
using System.IO;
using System.Web;
using System.Web.Hosting;
using Debug = System.Web.Util.Debug;
internal class TimeStampChecker {
internal const String CallContextSlotName = "TSC";
private Hashtable _timeStamps = new Hashtable(StringComparer.OrdinalIgnoreCase);
private static TimeStampChecker Current {
get {
TimeStampChecker tsc = (TimeStampChecker)System.Runtime.Remoting.Messaging.CallContext.GetData(
CallContextSlotName) as TimeStampChecker;
// Create it on demand
if (tsc == null) {
tsc = new TimeStampChecker();
Debug.Trace("TimeStampChecker", "Creating new TimeStampChecker");
System.Runtime.Remoting.Messaging.CallContext.SetData(CallContextSlotName, tsc);
}
return tsc;
}
}
internal static void AddFile(string virtualPath, string path) {
Current.AddFileInternal(virtualPath, path);
}
private void AddFileInternal(string virtualPath, string path) {
DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(path);
if (_timeStamps.Contains(virtualPath)) {
DateTime storedValue = (DateTime)_timeStamps[virtualPath];
// Already found to have changed before
if (storedValue == DateTime.MaxValue) {
Debug.Trace("TimeStampChecker", "AddFileInternal: Same time stamp (" + path + ")");
return;
}
// If it's different, set it to MaxValue as marker of being invalid
if (storedValue != lastWriteTimeUtc) {
_timeStamps[virtualPath] = DateTime.MaxValue;
Debug.Trace("TimeStampChecker", "AddFileInternal: Changed time stamp (" + path + ")");
}
}
else {
// New path: just add it
_timeStamps[virtualPath] = lastWriteTimeUtc;
Debug.Trace("TimeStampChecker", "AddFileInternal: New path (" + path + ")");
}
}
internal static bool CheckFilesStillValid(string key, ICollection virtualPaths) {
if (virtualPaths == null)
return true;
return Current.CheckFilesStillValidInternal(key, virtualPaths);
}
private bool CheckFilesStillValidInternal(string key, ICollection virtualPaths) {
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal (" + key + ")");
foreach (string virtualPath in virtualPaths) {
if (!_timeStamps.Contains(virtualPath))
continue;
string path = HostingEnvironment.MapPath(virtualPath);
DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(path);
DateTime storedValue = (DateTime)_timeStamps[virtualPath];
// If it changed, then it's not valid
if (lastWriteTimeUtc != storedValue) {
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal: File (" + path + ") has changed!");
return false;
}
}
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal (" + key + ") is still valid");
return true;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.Compilation {
using System;
using System.Collections;
using System.IO;
using System.Web;
using System.Web.Hosting;
using Debug = System.Web.Util.Debug;
internal class TimeStampChecker {
internal const String CallContextSlotName = "TSC";
private Hashtable _timeStamps = new Hashtable(StringComparer.OrdinalIgnoreCase);
private static TimeStampChecker Current {
get {
TimeStampChecker tsc = (TimeStampChecker)System.Runtime.Remoting.Messaging.CallContext.GetData(
CallContextSlotName) as TimeStampChecker;
// Create it on demand
if (tsc == null) {
tsc = new TimeStampChecker();
Debug.Trace("TimeStampChecker", "Creating new TimeStampChecker");
System.Runtime.Remoting.Messaging.CallContext.SetData(CallContextSlotName, tsc);
}
return tsc;
}
}
internal static void AddFile(string virtualPath, string path) {
Current.AddFileInternal(virtualPath, path);
}
private void AddFileInternal(string virtualPath, string path) {
DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(path);
if (_timeStamps.Contains(virtualPath)) {
DateTime storedValue = (DateTime)_timeStamps[virtualPath];
// Already found to have changed before
if (storedValue == DateTime.MaxValue) {
Debug.Trace("TimeStampChecker", "AddFileInternal: Same time stamp (" + path + ")");
return;
}
// If it's different, set it to MaxValue as marker of being invalid
if (storedValue != lastWriteTimeUtc) {
_timeStamps[virtualPath] = DateTime.MaxValue;
Debug.Trace("TimeStampChecker", "AddFileInternal: Changed time stamp (" + path + ")");
}
}
else {
// New path: just add it
_timeStamps[virtualPath] = lastWriteTimeUtc;
Debug.Trace("TimeStampChecker", "AddFileInternal: New path (" + path + ")");
}
}
internal static bool CheckFilesStillValid(string key, ICollection virtualPaths) {
if (virtualPaths == null)
return true;
return Current.CheckFilesStillValidInternal(key, virtualPaths);
}
private bool CheckFilesStillValidInternal(string key, ICollection virtualPaths) {
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal (" + key + ")");
foreach (string virtualPath in virtualPaths) {
if (!_timeStamps.Contains(virtualPath))
continue;
string path = HostingEnvironment.MapPath(virtualPath);
DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(path);
DateTime storedValue = (DateTime)_timeStamps[virtualPath];
// If it changed, then it's not valid
if (lastWriteTimeUtc != storedValue) {
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal: File (" + path + ") has changed!");
return false;
}
}
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal (" + key + ") is still valid");
return true;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FixedSOMContainer.cs
- FrameworkElementFactory.cs
- Tuple.cs
- DesignerOptions.cs
- WpfPayload.cs
- SafeProcessHandle.cs
- NavigationWindowAutomationPeer.cs
- XmlParserContext.cs
- IItemContainerGenerator.cs
- ConfigurationValidatorAttribute.cs
- BitConverter.cs
- HotSpot.cs
- DataRecordObjectView.cs
- EventSchemaTraceListener.cs
- WeakEventManager.cs
- MergablePropertyAttribute.cs
- ImportCatalogPart.cs
- XmlHierarchicalEnumerable.cs
- Monitor.cs
- AsyncOperationManager.cs
- SmtpTransport.cs
- XmlEncoding.cs
- AspNetCompatibilityRequirementsMode.cs
- XmlDataSource.cs
- Keyboard.cs
- HttpModulesSection.cs
- TemplateColumn.cs
- ViewPort3D.cs
- ClipboardData.cs
- MetadataWorkspace.cs
- Facet.cs
- AspNetCompatibilityRequirementsAttribute.cs
- AssemblyResourceLoader.cs
- ExtendedProtectionPolicy.cs
- ScrollableControl.cs
- TextParaLineResult.cs
- ProbeMatchesCD1.cs
- sqlpipe.cs
- _DisconnectOverlappedAsyncResult.cs
- ChangeConflicts.cs
- DomainUpDown.cs
- XmlFormatWriterGenerator.cs
- InnerItemCollectionView.cs
- Rectangle.cs
- SqlProcedureAttribute.cs
- ButtonBaseAutomationPeer.cs
- ToolBar.cs
- NameValueFileSectionHandler.cs
- NameScope.cs
- NonClientArea.cs
- AtlasWeb.Designer.cs
- WindowsBrush.cs
- EmptyQuery.cs
- ErasingStroke.cs
- ObjectFullSpanRewriter.cs
- FunctionQuery.cs
- XmlDataCollection.cs
- PlaceHolder.cs
- TemplateBuilder.cs
- NotFiniteNumberException.cs
- AppDomainAttributes.cs
- httpapplicationstate.cs
- PackageProperties.cs
- ExpressionBindings.cs
- XmlSortKey.cs
- FixedTextPointer.cs
- ToolboxItemAttribute.cs
- ChildChangedEventArgs.cs
- CodeDirectoryCompiler.cs
- XmlSerializationReader.cs
- TreeViewItem.cs
- GlyphShapingProperties.cs
- SymmetricKeyWrap.cs
- FontDialog.cs
- EdmComplexPropertyAttribute.cs
- GPStream.cs
- XmlCompatibilityReader.cs
- TextUtf8RawTextWriter.cs
- TreeWalkHelper.cs
- AutomationPattern.cs
- UdpConstants.cs
- KeyNameIdentifierClause.cs
- IssuanceTokenProviderBase.cs
- BaseResourcesBuildProvider.cs
- DBDataPermission.cs
- ConditionalBranch.cs
- ReflectionPermission.cs
- ParenExpr.cs
- SmiMetaData.cs
- EventMappingSettings.cs
- X509CertificateClaimSet.cs
- EventProviderWriter.cs
- DragAssistanceManager.cs
- SecurityStateEncoder.cs
- InlinedAggregationOperator.cs
- ToolStripItemCollection.cs
- base64Transforms.cs
- StringComparer.cs
- ExpandableObjectConverter.cs
- AlphabeticalEnumConverter.cs