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
- TimeSpanMinutesOrInfiniteConverter.cs
- ChildrenQuery.cs
- EntityDataSourceSelectedEventArgs.cs
- DBSqlParser.cs
- CompositeControl.cs
- CodeMethodInvokeExpression.cs
- TypeValidationEventArgs.cs
- WpfKnownMember.cs
- ToolStripHighContrastRenderer.cs
- InvocationExpression.cs
- XmlExpressionDumper.cs
- ExtensionFile.cs
- WorkflowRuntimeEndpoint.cs
- CapacityStreamGeometryContext.cs
- ScaleTransform3D.cs
- XPathDocumentNavigator.cs
- DataGridViewRowsAddedEventArgs.cs
- _UncName.cs
- RepeaterDataBoundAdapter.cs
- GlobalizationSection.cs
- UniqueID.cs
- localization.cs
- RelationHandler.cs
- X509ImageLogo.cs
- FixedSOMTable.cs
- GroupByExpressionRewriter.cs
- _AutoWebProxyScriptEngine.cs
- XmlReader.cs
- ListView.cs
- QilXmlWriter.cs
- CheckBox.cs
- ExternalFile.cs
- StyleTypedPropertyAttribute.cs
- CheckBoxField.cs
- propertyentry.cs
- DetailsViewDeletedEventArgs.cs
- VisualBasic.cs
- ConfigurationPropertyCollection.cs
- ProviderMetadataCachedInformation.cs
- CachingHintValidation.cs
- TableColumnCollection.cs
- _OSSOCK.cs
- ListView.cs
- NameTable.cs
- AsmxEndpointPickerExtension.cs
- ConfigurationElementProperty.cs
- SerializationException.cs
- ControlValuePropertyAttribute.cs
- CertificateManager.cs
- MultiDataTrigger.cs
- RegexCaptureCollection.cs
- DayRenderEvent.cs
- NullableDoubleMinMaxAggregationOperator.cs
- DataSourceControl.cs
- securestring.cs
- DataControlImageButton.cs
- ByteAnimationUsingKeyFrames.cs
- util.cs
- Model3DCollection.cs
- Empty.cs
- XhtmlBasicImageAdapter.cs
- MobileControlPersister.cs
- WebPartMenu.cs
- TemplatePropertyEntry.cs
- EntityDataSourceMemberPath.cs
- QilVisitor.cs
- StrongNameUtility.cs
- DayRenderEvent.cs
- OleDbParameterCollection.cs
- FieldReference.cs
- EncodingInfo.cs
- PointAnimationUsingKeyFrames.cs
- PerfCounters.cs
- SiteMapPath.cs
- PrintPreviewGraphics.cs
- AssociationSetEnd.cs
- MimeObjectFactory.cs
- SoapCodeExporter.cs
- ByteStream.cs
- DependencyPropertyDescriptor.cs
- GlyphRun.cs
- NamespaceInfo.cs
- OdbcConnectionOpen.cs
- BStrWrapper.cs
- AssemblyAttributes.cs
- WebPartConnectionsCancelEventArgs.cs
- RewritingPass.cs
- mediapermission.cs
- Unit.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- CodeAttributeDeclaration.cs
- TextServicesLoader.cs
- WmlTextViewAdapter.cs
- FaultReasonText.cs
- IndexerNameAttribute.cs
- MergeFailedEvent.cs
- CompoundFileStorageReference.cs
- TypeInitializationException.cs
- UIElement.cs
- DownloadProgressEventArgs.cs