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
- MergablePropertyAttribute.cs
- LicFileLicenseProvider.cs
- AssociationSet.cs
- OutputCacheSettings.cs
- DataObjectPastingEventArgs.cs
- ConfigurationFileMap.cs
- ConfigurationManagerHelper.cs
- ButtonFlatAdapter.cs
- PropertyRecord.cs
- DbConnectionPoolGroupProviderInfo.cs
- RSAOAEPKeyExchangeDeformatter.cs
- ContextDataSource.cs
- OperandQuery.cs
- RequestSecurityTokenSerializer.cs
- ScrollBarAutomationPeer.cs
- MouseGestureConverter.cs
- WindowsComboBox.cs
- ObservableCollectionDefaultValueFactory.cs
- Solver.cs
- SortKey.cs
- DetailsViewPagerRow.cs
- BindingFormattingDialog.cs
- SoapHeaderAttribute.cs
- FocusTracker.cs
- ResourceReader.cs
- TreeViewCancelEvent.cs
- LazyInitializer.cs
- DotExpr.cs
- SessionPageStateSection.cs
- ReturnEventArgs.cs
- ObjectPropertyMapping.cs
- DateTimeConverter2.cs
- ReversePositionQuery.cs
- MetadataCache.cs
- Floater.cs
- SchemaSetCompiler.cs
- SmiEventSink_Default.cs
- StructuralObject.cs
- FactoryGenerator.cs
- CodeSubDirectoriesCollection.cs
- DataRelationPropertyDescriptor.cs
- BaseTemplateCodeDomTreeGenerator.cs
- NameObjectCollectionBase.cs
- DataSourceCache.cs
- HostingPreferredMapPath.cs
- Variable.cs
- unsafenativemethodsother.cs
- BitmapEffect.cs
- IntegerValidator.cs
- BamlResourceDeserializer.cs
- remotingproxy.cs
- FormClosedEvent.cs
- DbConnectionPoolCounters.cs
- WindowsGraphicsWrapper.cs
- SmiRecordBuffer.cs
- ObjectKeyFrameCollection.cs
- QilVisitor.cs
- StreamInfo.cs
- RemotingConfigParser.cs
- HyperLinkColumn.cs
- InvokePattern.cs
- DependencyPropertyKey.cs
- DataServiceQueryContinuation.cs
- RegularExpressionValidator.cs
- TypedElement.cs
- ListControl.cs
- RequestSecurityTokenForGetBrowserToken.cs
- StringPropertyBuilder.cs
- SQLStringStorage.cs
- isolationinterop.cs
- DBCSCodePageEncoding.cs
- DependencyObjectValidator.cs
- UriTemplateTable.cs
- ExpressionTable.cs
- AnimationStorage.cs
- DataKeyArray.cs
- TypeLibraryHelper.cs
- CloudCollection.cs
- WebPartConnection.cs
- SQLGuid.cs
- ClaimSet.cs
- UnsafeNativeMethods.cs
- PerformanceCounterPermissionAttribute.cs
- TCPListener.cs
- Codec.cs
- TreeWalker.cs
- DllNotFoundException.cs
- SharedPerformanceCounter.cs
- WinInet.cs
- TokenBasedSetEnumerator.cs
- SingleTagSectionHandler.cs
- StructuredTypeInfo.cs
- SharedUtils.cs
- SettingsBase.cs
- ArrayConverter.cs
- SettingsAttributeDictionary.cs
- DocumentViewerAutomationPeer.cs
- DbConnectionOptions.cs
- HiddenFieldPageStatePersister.cs
- XmlAttribute.cs