Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / System / data / design / PropertyReferenceSerializer.cs / 1 / PropertyReferenceSerializer.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All Rights Reserved. // Information Contained Herein is Proprietary and Confidential. // //----------------------------------------------------------------------------- namespace System.Data.Design { using System; using System.CodeDom; using System.CodeDom.Compiler; using System.IO; using System.Text; using System.Diagnostics; using System.Runtime.Serialization; ////// internal class PropertyReferenceSerializer { private const string applicationSettingsPrefix = "ApplicationSettings"; private const string appConfigPrefix = "AppConfig"; // private constructor to avoid class being instantiated. private PropertyReferenceSerializer() { } internal static string Serialize(CodePropertyReferenceExpression expression) { if (IsWellKnownApplicationSettingsExpression(expression)) { return SerializeApplicationSettingsExpression(expression); } if (IsWellKnownAppConfigExpression(expression)) { return SerializeAppConfigExpression(expression); } Debug.Assert(false, "Unable to recognize Connection Property Reference for serialization, falling back to SOAPFormatter."); return SerializeWithSoapFormatter(expression); } internal static CodePropertyReferenceExpression Deserialize(string expressionString) { string[] expressionParts = expressionString.Split('.'); if (expressionParts != null && expressionParts.Length > 0) { if (StringUtil.EqualValue(expressionParts[0], applicationSettingsPrefix)) { return DeserializeApplicationSettingsExpression(expressionParts); } if (StringUtil.EqualValue(expressionParts[0], appConfigPrefix)) { return DeserializeAppConfigExpression(expressionParts); } } // if our custom deserialization failed, fall back to the SOAP Formatter; this will also provide backward compatibility // with Beta2 UTF8Encoding encoding = new UTF8Encoding(); MemoryStream stream = new MemoryStream(encoding.GetBytes(expressionString)); IFormatter formatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter(); return (CodePropertyReferenceExpression)formatter.Deserialize(stream); } private static string SerializeWithSoapFormatter(CodePropertyReferenceExpression expression) { MemoryStream stream = new MemoryStream(); IFormatter formatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter(); formatter.Serialize(stream, expression); if (stream.Length > (long)int.MaxValue) { throw new InternalException("Serialized property expression is too long."); } UTF8Encoding encoding = new UTF8Encoding(); byte[] buffer = new byte[stream.Length]; stream.Position = 0; stream.Read(buffer, 0, (int)stream.Length); return encoding.GetString(buffer); } private static string SerializeApplicationSettingsExpression(CodePropertyReferenceExpression expression) { string serializationString = expression.PropertyName; CodePropertyReferenceExpression targetObject = (CodePropertyReferenceExpression)expression.TargetObject; serializationString = targetObject.PropertyName + "." + serializationString; CodeTypeReferenceExpression typeReference = (CodeTypeReferenceExpression)targetObject.TargetObject; serializationString = typeReference.Type.Options.ToString() + "." + serializationString; serializationString = typeReference.Type.BaseType + "." + serializationString; serializationString = applicationSettingsPrefix + "." + serializationString; return serializationString; } private static string SerializeAppConfigExpression(CodePropertyReferenceExpression expression) { string serializationString = expression.PropertyName; CodeIndexerExpression targetObject = (CodeIndexerExpression)expression.TargetObject; string indexValue = ((CodePrimitiveExpression)targetObject.Indices[0]).Value as string; serializationString = indexValue + "." + serializationString; CodePropertyReferenceExpression indexTarget = (CodePropertyReferenceExpression)targetObject.TargetObject; serializationString = indexTarget.PropertyName + "." + serializationString; CodeTypeReferenceExpression typeReference = (CodeTypeReferenceExpression)indexTarget.TargetObject; serializationString = typeReference.Type.Options.ToString() + "." + serializationString; serializationString = typeReference.Type.BaseType + "." + serializationString; serializationString = appConfigPrefix + "." + serializationString; return serializationString; } private static bool IsWellKnownApplicationSettingsExpression(CodePropertyReferenceExpression expression) { if (expression.UserData != null && expression.UserData.Count > 0) { return false; } if (!(expression.TargetObject is CodePropertyReferenceExpression)) { return false; } CodePropertyReferenceExpression targetObject = (CodePropertyReferenceExpression)expression.TargetObject; if (targetObject.UserData != null && targetObject.UserData.Count > 0) { return false; } if (!(targetObject.TargetObject is CodeTypeReferenceExpression)) { return false; } CodeTypeReferenceExpression typeReference = (CodeTypeReferenceExpression)targetObject.TargetObject; if (typeReference.UserData != null && typeReference.UserData.Count > 0) { return false; } CodeTypeReference type = typeReference.Type; if (type.UserData != null && type.UserData.Count > 0) { return false; } if (type.TypeArguments != null && type.TypeArguments.Count > 0) { return false; } if (type.ArrayElementType != null || type.ArrayRank > 0) { return false; } return true; } private static bool IsWellKnownAppConfigExpression(CodePropertyReferenceExpression expression) { if (expression.UserData != null && expression.UserData.Count > 0) { return false; } if (!(expression.TargetObject is CodeIndexerExpression)) { return false; } CodeIndexerExpression targetObject = (CodeIndexerExpression)expression.TargetObject; if (targetObject.UserData != null && targetObject.UserData.Count > 0) { return false; } if (targetObject.Indices == null || targetObject.Indices.Count != 1 || !(targetObject.Indices[0] is CodePrimitiveExpression)) { return false; } if (!(((CodePrimitiveExpression)targetObject.Indices[0]).Value is string)) { return false; } if (!(targetObject.TargetObject is CodePropertyReferenceExpression)) { return false; } CodePropertyReferenceExpression indexTarget = (CodePropertyReferenceExpression)targetObject.TargetObject; if (indexTarget.UserData != null && indexTarget.UserData.Count > 0) { return false; } if (!(indexTarget.TargetObject is CodeTypeReferenceExpression)) { return false; } CodeTypeReferenceExpression typeReference = (CodeTypeReferenceExpression)indexTarget.TargetObject; if (typeReference.UserData != null && typeReference.UserData.Count > 0) { return false; } CodeTypeReference type = typeReference.Type; if (type.UserData != null && type.UserData.Count > 0) { return false; } if (type.TypeArguments != null && type.TypeArguments.Count > 0) { return false; } if (type.ArrayElementType != null || type.ArrayRank > 0) { return false; } return true; } private static CodePropertyReferenceExpression DeserializeApplicationSettingsExpression(string[] expressionParts) { int currentPart = expressionParts.Length - 1; CodePropertyReferenceExpression outerExpression = new CodePropertyReferenceExpression(); outerExpression.PropertyName = expressionParts[currentPart]; currentPart--; CodePropertyReferenceExpression targetObject = new CodePropertyReferenceExpression(); outerExpression.TargetObject = targetObject; targetObject.PropertyName = expressionParts[currentPart]; currentPart--; CodeTypeReferenceExpression targetType = new CodeTypeReferenceExpression(); targetObject.TargetObject = targetType; targetType.Type.Options = (CodeTypeReferenceOptions)Enum.Parse(typeof(CodeTypeReferenceOptions), expressionParts[currentPart]); currentPart--; targetType.Type.BaseType = expressionParts[currentPart]; currentPart--; while (currentPart > 0) { targetType.Type.BaseType = expressionParts[currentPart] + "." + targetType.Type.BaseType; currentPart--; } return outerExpression; } private static CodePropertyReferenceExpression DeserializeAppConfigExpression(string[] expressionParts) { int currentPart = expressionParts.Length - 1; CodePropertyReferenceExpression outerExpression = new CodePropertyReferenceExpression(); outerExpression.PropertyName = expressionParts[currentPart]; currentPart--; CodeIndexerExpression indexerExpression = new CodeIndexerExpression(); outerExpression.TargetObject = indexerExpression; indexerExpression.Indices.Add(new CodePrimitiveExpression(expressionParts[currentPart])); currentPart--; CodePropertyReferenceExpression indexTarget = new CodePropertyReferenceExpression(); indexerExpression.TargetObject = indexTarget; indexTarget.PropertyName = expressionParts[currentPart]; currentPart--; CodeTypeReferenceExpression targetType = new CodeTypeReferenceExpression(); indexTarget.TargetObject = targetType; targetType.Type.Options = (CodeTypeReferenceOptions)Enum.Parse(typeof(CodeTypeReferenceOptions), expressionParts[currentPart]); currentPart--; targetType.Type.BaseType = expressionParts[currentPart]; currentPart--; while (currentPart > 0) { targetType.Type.BaseType = expressionParts[currentPart] + "." + targetType.Type.BaseType; currentPart--; } return outerExpression; } } } // 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
- DataMisalignedException.cs
- DocumentApplicationJournalEntry.cs
- Internal.cs
- LinkLabelLinkClickedEvent.cs
- SqlProfileProvider.cs
- Bind.cs
- TextServicesProperty.cs
- SchemaSetCompiler.cs
- Visitor.cs
- Bezier.cs
- EntityExpressionVisitor.cs
- Window.cs
- InputMethodStateTypeInfo.cs
- SelectorAutomationPeer.cs
- GeneralTransform.cs
- PropertyMetadata.cs
- TableLayoutPanelCodeDomSerializer.cs
- MissingSatelliteAssemblyException.cs
- counter.cs
- BlurBitmapEffect.cs
- InvalidOperationException.cs
- XmlBinaryReader.cs
- CacheAxisQuery.cs
- ThreadSafeList.cs
- ToolboxComponentsCreatedEventArgs.cs
- JapaneseLunisolarCalendar.cs
- MenuEventArgs.cs
- ConfigurationStrings.cs
- ProtocolInformationReader.cs
- Column.cs
- SelfIssuedAuthProofToken.cs
- VectorCollection.cs
- LogEntrySerialization.cs
- FormsAuthenticationTicket.cs
- CodeRemoveEventStatement.cs
- DragDrop.cs
- TemplateControl.cs
- WebPartUtil.cs
- HttpHandlerActionCollection.cs
- RoutedUICommand.cs
- PerfCounters.cs
- KeyProperty.cs
- XmlSchema.cs
- TablePattern.cs
- UDPClient.cs
- AndCondition.cs
- SamlSubjectStatement.cs
- ListBoxChrome.cs
- IndexExpression.cs
- AutomationPropertyChangedEventArgs.cs
- FixedDSBuilder.cs
- HttpConfigurationContext.cs
- CompositeCollection.cs
- StorageEntityContainerMapping.cs
- MetabaseSettings.cs
- ThemeDirectoryCompiler.cs
- SessionPageStatePersister.cs
- SimpleRecyclingCache.cs
- QuaternionRotation3D.cs
- StorageAssociationSetMapping.cs
- Win32Native.cs
- CopyNodeSetAction.cs
- TypeUnloadedException.cs
- MethodSet.cs
- SimpleTypeResolver.cs
- DesignTimeTemplateParser.cs
- DispatcherHookEventArgs.cs
- XmlEventCache.cs
- DrawListViewItemEventArgs.cs
- CodeMemberField.cs
- ParamArrayAttribute.cs
- RangeEnumerable.cs
- SpeechSeg.cs
- XmlCompatibilityReader.cs
- AsyncStreamReader.cs
- PtsContext.cs
- SqlPersonalizationProvider.cs
- InputProcessorProfiles.cs
- CollectionViewProxy.cs
- OrderingQueryOperator.cs
- SharedHttpsTransportManager.cs
- httpapplicationstate.cs
- GC.cs
- EntityDataSourceContextDisposingEventArgs.cs
- TypeDescriptionProvider.cs
- CallbackTimeoutsBehavior.cs
- FormsAuthenticationUserCollection.cs
- DetailsViewUpdatedEventArgs.cs
- Stream.cs
- RtfControls.cs
- TimeSpanMinutesConverter.cs
- BamlLocalizableResource.cs
- Compiler.cs
- ResourceDisplayNameAttribute.cs
- _HelperAsyncResults.cs
- ComponentSerializationService.cs
- DesigntimeLicenseContext.cs
- CallContext.cs
- RoleManagerEventArgs.cs
- RelatedCurrencyManager.cs