Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / System / data / design / TypedDataSetSchemaImporterExtension.cs / 4 / TypedDataSetSchemaImporterExtension.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.Collections; using System.Collections.Specialized; using System.IO; using System.Reflection; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using System.Xml.Serialization.Advanced; public class TypedDataSetSchemaImporterExtension : SchemaImporterExtension { Hashtable importedTypes = new Hashtable(); TypedDataSetGenerator.GenerateOption dataSetGenerateOptions; public TypedDataSetSchemaImporterExtension () : this(TypedDataSetGenerator.GenerateOption.None) { } protected TypedDataSetSchemaImporterExtension (TypedDataSetGenerator.GenerateOption dataSetGenerateOptions) { this.dataSetGenerateOptions = dataSetGenerateOptions; } public override string ImportSchemaType(string name, string namespaceName, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) { IList values = schemas.GetSchemas(namespaceName); if (values.Count != 1) { return null; } XmlSchema schema = values[0] as XmlSchema; if (schema == null) return null; XmlSchemaType type = (XmlSchemaType)schema.SchemaTypes[new XmlQualifiedName(name, namespaceName)]; return ImportSchemaType(type, context, schemas, importer, compileUnit, mainNamespace, options, codeProvider); } public override string ImportSchemaType(XmlSchemaType type, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) { if (type == null) { return null; } if (!(context is XmlSchemaElement)) { return null; } XmlSchemaElement e = (XmlSchemaElement)context; if (IsDataSet(e)) { if (importedTypes[type] != null) { // if we have the type in our internal cache already, we assume we already generated the code for it in // compileUnit/mainNamespace and we also added referenced assemblies to the CompileUnit; so we can just // return the type name. return (string)importedTypes[type]; } return GenerateTypedDataSet(e, schemas, compileUnit, mainNamespace, codeProvider); } if (type is XmlSchemaComplexType) { XmlSchemaComplexType ct = (XmlSchemaComplexType)type; if (ct.Particle is XmlSchemaSequence) { XmlSchemaObjectCollection items = ((XmlSchemaSequence)ct.Particle).Items; if (items.Count == 2 && items[0] is XmlSchemaAny && items[1] is XmlSchemaAny) { XmlSchemaAny any0 = (XmlSchemaAny)items[0]; XmlSchemaAny any1 = (XmlSchemaAny)items[1]; if (any0.Namespace == XmlSchema.Namespace && any1.Namespace == "urn:schemas-microsoft-com:xml-diffgram-v1") { // new diffgramm format string ns = null; string tableName = null; foreach (XmlSchemaAttribute a in ct.Attributes) { if (a.Name == "namespace") { ns = a.FixedValue.Trim(); } else if (a.Name == "tableTypeName") { // typed table XmlSerialization support; we generate a typed dataset, // but return the typed table class name to the proxy generator tableName = a.FixedValue.Trim(); } if (ns != null && tableName != null) { break; } } if (ns == null) { return null; } else { IList values = schemas.GetSchemas(ns); if (values.Count != 1) { return null; } XmlSchema schema = values[0] as XmlSchema; if (schema == null || schema.Id == null) { return null; } XmlSchemaElement ds = FindDataSetElement(schema, schemas); if (ds != null) { string datasetName = ImportSchemaType(ds.SchemaType, ds, schemas, importer, compileUnit, mainNamespace, options, codeProvider); if (tableName == null) { return datasetName; } else { return CodeGenHelper.GetTypeName(codeProvider, datasetName, tableName); } } else { return null; } } } } } if (ct.Particle is XmlSchemaSequence || ct.Particle is XmlSchemaAll) { XmlSchemaObjectCollection items = ((XmlSchemaGroupBase)ct.Particle).Items; if (items.Count == 1) { if (!(items[0] is XmlSchemaAny)) { return null; } XmlSchemaAny any = (XmlSchemaAny)items[0]; if (any.Namespace == null) { return null; } if (any.Namespace.IndexOf('#') >= 0) { return null; // special syntax (##any, ##other, ...) } if (any.Namespace.IndexOf(' ') >= 0) { return null; // more than one Uri present } IList values = schemas.GetSchemas(any.Namespace); if (values.Count != 1) { return null; } XmlSchema schema = values[0] as XmlSchema; if (schema == null) { return null; } if (schema.Id == null) { return null; } XmlSchemaElement ds = FindDataSetElement(schema, schemas); if (ds != null) { return ImportSchemaType(ds.SchemaType, ds, schemas, importer, compileUnit, mainNamespace, options, codeProvider); } else { return null; } } } } return null; } internal string GenerateTypedDataSet(XmlSchemaElement element, XmlSchemas schemas, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeDomProvider codeProvider) { if (element == null) { return null; } if (importedTypes[element.SchemaType] != null) { // if we have the type in our internal cache already, we assume we already generated the code for it in // compileUnit/mainNamespace and we also added referenced assemblies to the CompileUnit; so we can just // return the type name. return (string)importedTypes[element.SchemaType]; } IList values = schemas.GetSchemas(element.QualifiedName.Namespace); if (values.Count != 1) { return null; } XmlSchema schema = values[0] as XmlSchema; if (schema == null) { return null; } MemoryStream stream = new MemoryStream(); schema.Write(stream); stream.Position = 0; DesignDataSource ds = new DesignDataSource(); ds.ReadXmlSchema(stream); stream.Close(); string typeName = TypedDataSetGenerator.GenerateInternal(ds, compileUnit, mainNamespace, codeProvider, this.dataSetGenerateOptions, null); importedTypes.Add(element.SchemaType, typeName); return typeName; } internal static bool IsDataSet(XmlSchemaElement e) { if (e.UnhandledAttributes != null) { foreach (XmlAttribute a in e.UnhandledAttributes) { if (a.LocalName == "IsDataSet" && a.NamespaceURI == Keywords.MSDNS) { // currently the msdata:IsDataSet uses its own format for the boolean values if (a.Value == "True" || a.Value == "true" || a.Value == "1") { return true; } } } } return false; } internal XmlSchemaElement FindDataSetElement(XmlSchema schema, XmlSchemas schemas) { foreach(XmlSchemaObject item in schema.Items) { if (item is XmlSchemaElement && IsDataSet((XmlSchemaElement)item)) { XmlSchemaElement ds = (XmlSchemaElement)item; // return cached element in the case if we doing typesharing return (XmlSchemaElement)schemas.Find(ds.QualifiedName, typeof(XmlSchemaElement)); } } return null; } } internal sealed class Keywords { private Keywords() { /* prevent utility class from being insantiated*/ } // Keywords for DataSet Namespace internal const string MSDNS = "urn:schemas-microsoft-com:xml-msdata"; internal const string DFFNS = "urn:schemas-microsoft-com:xml-diffgram-v1"; internal const string WS_DATASETFULLQNAME = "system.data.dataset"; internal const string WS_VERSION = "WSDL_VERSION"; } } // 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
- PageAsyncTask.cs
- AppDomainManager.cs
- InternalRelationshipCollection.cs
- SafeRightsManagementPubHandle.cs
- CodeDomLocalizationProvider.cs
- DataGridViewHitTestInfo.cs
- _NetRes.cs
- TextRange.cs
- PagerSettings.cs
- SmtpNtlmAuthenticationModule.cs
- QueueProcessor.cs
- Journaling.cs
- AttributeCollection.cs
- StylusCaptureWithinProperty.cs
- XmlSerializationReader.cs
- ExpressionWriter.cs
- MasterPage.cs
- FrameworkContentElement.cs
- CaretElement.cs
- AutomationPeer.cs
- XmlSchemaSimpleTypeList.cs
- TypeBuilder.cs
- WsatAdminException.cs
- URLMembershipCondition.cs
- OdbcError.cs
- TextElementEnumerator.cs
- PageCache.cs
- DataBoundControlHelper.cs
- Polyline.cs
- ScriptComponentDescriptor.cs
- SqlUdtInfo.cs
- DialogResultConverter.cs
- Bits.cs
- RegistryPermission.cs
- MemoryFailPoint.cs
- UIServiceHelper.cs
- FlatButtonAppearance.cs
- ClusterSafeNativeMethods.cs
- DataContractSerializer.cs
- DataGridViewColumnEventArgs.cs
- CharEnumerator.cs
- DataGridViewRowHeaderCell.cs
- FormClosingEvent.cs
- FileDialog_Vista.cs
- columnmapfactory.cs
- RemotingServices.cs
- ZoneButton.cs
- MD5CryptoServiceProvider.cs
- CodeDomSerializer.cs
- MetadataCollection.cs
- PartialCachingAttribute.cs
- RoleManagerModule.cs
- IssuanceLicense.cs
- ParagraphVisual.cs
- HtmlTableRowCollection.cs
- TemplateControlCodeDomTreeGenerator.cs
- StrokeCollection.cs
- ToolStripPanelRenderEventArgs.cs
- WpfGeneratedKnownTypes.cs
- Assembly.cs
- RayMeshGeometry3DHitTestResult.cs
- MarkupWriter.cs
- Rotation3DAnimationUsingKeyFrames.cs
- ConfigurationValidatorBase.cs
- DetailsViewInsertedEventArgs.cs
- PointHitTestParameters.cs
- ObjectQueryExecutionPlan.cs
- FormClosedEvent.cs
- BaseCollection.cs
- OperationContext.cs
- SqlCharStream.cs
- PreviewPrintController.cs
- NamespaceCollection.cs
- ColorMap.cs
- _HeaderInfo.cs
- DbConvert.cs
- SqlRowUpdatingEvent.cs
- RuntimeHandles.cs
- InvokeMethodDesigner.xaml.cs
- MsmqMessageSerializationFormat.cs
- NotFiniteNumberException.cs
- ArrangedElement.cs
- XDRSchema.cs
- XmlILOptimizerVisitor.cs
- ScriptComponentDescriptor.cs
- ReservationNotFoundException.cs
- TraceInternal.cs
- MethodBody.cs
- Rijndael.cs
- COM2AboutBoxPropertyDescriptor.cs
- WebBrowserNavigatedEventHandler.cs
- EditingCommands.cs
- PrePostDescendentsWalker.cs
- WmlPhoneCallAdapter.cs
- OperationAbortedException.cs
- TextBoxAutoCompleteSourceConverter.cs
- UserMapPath.cs
- Matrix3DStack.cs
- Translator.cs
- Utils.cs