Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataWeb / Server / System / Data / Services / UpdateTracker.cs / 1 / UpdateTracker.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Provides a class used to track updates for callbacks.
//
//
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Services
{
using System.Collections.Generic;
using System.Data.Services.Providers;
using System.Diagnostics;
using System.Reflection;
/// Provides a class used to track updates for callbacks.
internal class UpdateTracker
{
#region Private fields.
///
/// A dictionary of containers mapping to the changes on those
/// containers, each of which consists of an element and the
/// action taken on it.
///
private Dictionary> items;
/// Underlying data source instance.
private IDataServiceProvider provider;
#endregion Private fields.
/// Initializes a new instance.
/// underlying data source instance.
private UpdateTracker(IDataServiceProvider provider)
{
this.provider = provider;
this.items = new Dictionary>();
}
/// Fires the notification for a single action.
/// Service on which methods should be invoked.
/// Object to be tracked.
/// Container in which object is changed.
/// Action affecting target.
internal static void FireNotification(object service, object target, ResourceContainer container, UpdateOperations action)
{
Debug.Assert(service != null, "service != null");
AssertActionValues(target, container);
MethodInfo[] methods = container.WriteAuthorizationMethods;
if (methods != null)
{
object[] parameters = new object[2];
parameters[0] = target;
parameters[1] = action;
for (int i = 0; i < methods.Length; i++)
{
try
{
methods[i].Invoke(service, parameters);
}
catch (TargetInvocationException exception)
{
ErrorHandler.HandleTargetInvocationException(exception);
throw;
}
}
}
}
///
/// Create a new instance of update tracker
///
/// description about the request uri.
/// underlying data source.
///
/// Returns a new instance of UpdateTracker if the request is not targetted at open types; null otherwise.
///
#if !ASTORIA_OPEN_OBJECT
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "description", Justification = "Required for open type support")]
#endif
internal static UpdateTracker CreateUpdateTracker(RequestDescription description, IDataServiceProvider provider)
{
// We don't support notifications for open types. Hence not creating a tracker for open types request.
#if ASTORIA_OPEN_OBJECT
if (description.TargetKind != RequestTargetKind.OpenProperty &&
description.TargetKind != RequestTargetKind.OpenPropertyValue)
{
#endif
return new UpdateTracker(provider);
#if ASTORIA_OPEN_OBJECT
}
return null;
#endif
}
/// Fires all notifications
/// Service on which methods should be invoked.
internal void FireNotifications(object service)
{
Debug.Assert(service != null, "service != null");
object[] parameters = new object[2];
foreach (var item in this.items)
{
MethodInfo[] methods = item.Key.WriteAuthorizationMethods;
Debug.Assert(methods != null, "methods != null - should not have been tracking changes to the container otherwise.");
foreach (var element in item.Value)
{
parameters[0] = this.provider.ResolveResource(element.Key);
parameters[1] = element.Value;
for (int i = 0; i < methods.Length; i++)
{
try
{
methods[i].Invoke(service, parameters);
}
catch (TargetInvocationException exception)
{
ErrorHandler.HandleTargetInvocationException(exception);
throw;
}
}
}
// Make elements elegible for garbage collection.
item.Value.Clear();
}
// Make dictionary elegible for garbage collection.
this.items = null;
}
///
/// Tracks the specified for a
/// given on the .
///
/// Object to be tracked.
/// Container in which object is changed.
/// Action affecting target.
///
/// If was already being tracked, the actions are OR'ed together.
///
internal void TrackAction(object target, ResourceContainer container, UpdateOperations action)
{
AssertActionValues(target, container);
Debug.Assert(this.items != null, "this.items != null - otherwise FireNotification has already been called");
// If it won't be necessary for us to fire authorizatio methods,
// skip tracking altogether.
if (container.WriteAuthorizationMethods == null)
{
return;
}
// Get the container for which the change has taken place.
Dictionary
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PersonalizationState.cs
- BitmapPalette.cs
- XmlDictionary.cs
- Int32Storage.cs
- WebControlParameterProxy.cs
- OutputCacheSettingsSection.cs
- LoginUtil.cs
- _CommandStream.cs
- InlineObject.cs
- AlternateViewCollection.cs
- ListViewItem.cs
- XsltLoader.cs
- IsolationInterop.cs
- SpAudioStreamWrapper.cs
- CommonProperties.cs
- ClockController.cs
- VisualCollection.cs
- SmiSettersStream.cs
- Registry.cs
- XmlHierarchicalEnumerable.cs
- Hyperlink.cs
- PrimitiveCodeDomSerializer.cs
- PermissionSetEnumerator.cs
- ToolboxBitmapAttribute.cs
- SyntaxCheck.cs
- ILGenerator.cs
- ColorConvertedBitmap.cs
- ScrollItemPatternIdentifiers.cs
- CodeSubDirectoriesCollection.cs
- ScriptDescriptor.cs
- BaseHashHelper.cs
- CodeLinePragma.cs
- FileDialog.cs
- SqlCrossApplyToCrossJoin.cs
- ItemCollection.cs
- OdbcReferenceCollection.cs
- FontFamily.cs
- SourceInterpreter.cs
- DesignerLabelAdapter.cs
- DrawingContextWalker.cs
- dataSvcMapFileLoader.cs
- SQLMoney.cs
- InvokeMethodActivity.cs
- Application.cs
- ScriptMethodAttribute.cs
- AppDomainResourcePerfCounters.cs
- BindingCollection.cs
- WriteFileContext.cs
- DbConnectionOptions.cs
- PEFileReader.cs
- DataGridViewCellStyleEditor.cs
- HtmlInputImage.cs
- DmlSqlGenerator.cs
- RecordBuilder.cs
- _NestedSingleAsyncResult.cs
- ServiceControllerDesigner.cs
- _NetRes.cs
- CachedPathData.cs
- PolyBezierSegment.cs
- ListenerElementsCollection.cs
- DbConnectionPoolIdentity.cs
- SchemaTableColumn.cs
- CompressEmulationStream.cs
- SettingsPropertyValue.cs
- SchemaComplexType.cs
- GridViewCommandEventArgs.cs
- ListViewEditEventArgs.cs
- ControlEvent.cs
- StrongTypingException.cs
- ScrollChangedEventArgs.cs
- FileSystemWatcher.cs
- SuppressIldasmAttribute.cs
- IPAddress.cs
- CodeRegionDirective.cs
- FixedDocumentPaginator.cs
- OrderedHashRepartitionStream.cs
- TextViewBase.cs
- MergablePropertyAttribute.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- Int32Converter.cs
- PerformanceCountersBase.cs
- FileDialog_Vista.cs
- TableRow.cs
- HierarchicalDataTemplate.cs
- SplineKeyFrames.cs
- ZipIOCentralDirectoryBlock.cs
- HttpListenerRequest.cs
- ProvidersHelper.cs
- BatchServiceHost.cs
- ExtentKey.cs
- ServicePoint.cs
- BaseDataBoundControl.cs
- ObjectDataSourceSelectingEventArgs.cs
- ObjectDataSourceStatusEventArgs.cs
- DataColumn.cs
- QilName.cs
- WCFModelStrings.Designer.cs
- ObjectItemCollection.cs
- LineInfo.cs
- RecognizedWordUnit.cs