Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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 /// underlying data source instance. private UpdateTracker(IDataServiceProvider provider) { this.provider = provider; this.items = new Dictionaryinstance. >(); } /// 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 /// Object to be tracked. /// Container in which object is changed. /// Action affecting target. ///for a /// given on the . /// /// If 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. Dictionarywas already being tracked, the actions are OR'ed together. ///
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- LongValidator.cs
- AutoGeneratedField.cs
- CodeVariableDeclarationStatement.cs
- CheckBoxFlatAdapter.cs
- SatelliteContractVersionAttribute.cs
- RuleInfoComparer.cs
- MetadataWorkspace.cs
- FrameworkElementFactory.cs
- XmlDataSourceNodeDescriptor.cs
- XslException.cs
- ConsoleCancelEventArgs.cs
- FixedHighlight.cs
- SqlDelegatedTransaction.cs
- HandleExceptionArgs.cs
- ClientSideProviderDescription.cs
- Scheduling.cs
- HttpStaticObjectsCollectionBase.cs
- Literal.cs
- InternalRelationshipCollection.cs
- Control.cs
- Sentence.cs
- XmlCDATASection.cs
- DecoderNLS.cs
- SafeTokenHandle.cs
- StringAnimationUsingKeyFrames.cs
- FillRuleValidation.cs
- SwitchElementsCollection.cs
- SmuggledIUnknown.cs
- DataGridViewSelectedRowCollection.cs
- DrawingAttributesDefaultValueFactory.cs
- Variant.cs
- MessagePropertyDescriptionCollection.cs
- UpdateRecord.cs
- EasingKeyFrames.cs
- ParserContext.cs
- ButtonColumn.cs
- SupportingTokenAuthenticatorSpecification.cs
- IntranetCredentialPolicy.cs
- Int32AnimationUsingKeyFrames.cs
- MulticastNotSupportedException.cs
- TreeNodeEventArgs.cs
- AttachedPropertyBrowsableForTypeAttribute.cs
- HtmlHistory.cs
- PenContext.cs
- SingleQueryOperator.cs
- PassportPrincipal.cs
- DataGridViewColumnDividerDoubleClickEventArgs.cs
- PeerNearMe.cs
- NonBatchDirectoryCompiler.cs
- SecurityPolicySection.cs
- CssTextWriter.cs
- WindowProviderWrapper.cs
- HwndMouseInputProvider.cs
- GB18030Encoding.cs
- BoolExpr.cs
- XmlDomTextWriter.cs
- RestHandlerFactory.cs
- EncoderExceptionFallback.cs
- PriorityRange.cs
- ContractNamespaceAttribute.cs
- SymmetricKey.cs
- X509Certificate2.cs
- XamlWriter.cs
- XmlSchemaComplexContentExtension.cs
- WebServiceClientProxyGenerator.cs
- Size3D.cs
- CodePrimitiveExpression.cs
- CharConverter.cs
- ListViewItemSelectionChangedEvent.cs
- CellParaClient.cs
- Buffer.cs
- HtmlProps.cs
- AuthenticatingEventArgs.cs
- TraceListeners.cs
- InvokeProviderWrapper.cs
- Context.cs
- DeleteCardRequest.cs
- PropertyPath.cs
- WebEventTraceProvider.cs
- FrameworkObject.cs
- Image.cs
- ReadOnlyTernaryTree.cs
- DataGridViewTextBoxEditingControl.cs
- _LoggingObject.cs
- categoryentry.cs
- InertiaRotationBehavior.cs
- ValueCollectionParameterReader.cs
- XmlCountingReader.cs
- HtmlPageAdapter.cs
- CodeAttachEventStatement.cs
- XmlSchemaSimpleType.cs
- UpdateCompiler.cs
- EventsTab.cs
- PackageRelationshipSelector.cs
- FontStretch.cs
- TaskFactory.cs
- ForEachAction.cs
- CookieProtection.cs
- XMLSyntaxException.cs
- FileDialogCustomPlace.cs