Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / infocard / Service / managed / Microsoft / InfoCards / Canonicalizers.cs / 1 / Canonicalizers.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.InfoCards
{
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using IDT = Microsoft.InfoCards.Diagnostics.InfoCardTrace;
//
// Summary
// Manages the Different canonicalization forms and routines
// we require for use during indexing.
//
internal sealed class Canonicalizers
{
delegate byte[] CanonicalizeObjectCallback( object dataToHash );
static ICanonicalizer s_binary;
static ICanonicalizer s_caseInsensitiveWithHashing;
static ICanonicalizer s_caseSensitiveWithHashing;
static ICanonicalizer s_binaryWithHashing;
private Canonicalizers()
{
}
//
// Summary
// Returns the global instance of a CaseSensitive Canonicalizer. This instance
// Will hash the value, allowing the entire string value to be matched against.
//
// Remarks
// This should be used with string based indexes only.
//
public static ICanonicalizer CaseInsensitiveWithHashing
{
get
{
if( null == s_caseInsensitiveWithHashing )
{
s_caseInsensitiveWithHashing = new CaseInsensitiveCanonicalizer( true, Encoding.Unicode, CultureInfo.InvariantCulture );
}
return s_caseInsensitiveWithHashing;
}
}
//
// Summary
// Returns the global instance of a CaseSensitive Canonicalizer. This instance
// Will hash the value, allowing the entire string value to be matched against.
//
// Remarks
// This should be used with string based indexes only.
//
public static ICanonicalizer CaseSensitiveWithHashing
{
get
{
if( null == s_caseSensitiveWithHashing )
{
s_caseSensitiveWithHashing = new CaseSensitiveCanonicalizer( true, Encoding.Unicode, CultureInfo.InvariantCulture );
}
return s_caseSensitiveWithHashing;
}
}
//
// Summary
// Returns the global instance of a Binary Canonicalizer. This instance will use
// the raw binary form of the input. If the data is larger than the size of the
// index, it will be truncated.
//
// Remarks
// This should be used with string based indexes only.
// This Canonicalizer supports the following datatypes:
// Int16
// UInt16
// Int32
// UInt32
// Int64
// UInt64
// Byte
// Byte[]
// String
// Uri
// Guid
// GlobalId
//
public static ICanonicalizer Binary
{
get
{
if( null == s_binary )
{
s_binary = new BinaryCanonicalizer( false );
}
return s_binary;
}
}
//
// Summary
// Returns the global instance of a Binary Canonicalizer. This instance will use
// the raw binary form of the input. The data is hashed before inserted into an index,
// so the value can exceed the size of the index.
//
// Remarks
// This should be used with string based indexes only.
// This Canonicalizer supports the following datatypes:
// Int16
// UInt16
// Int32
// UInt32
// Int64
// UInt64
// Byte
// Byte[]
// String
// Uri
// Guid
// GlobalId
//
public static ICanonicalizer BinaryWithHashing
{
get
{
if( null == s_binaryWithHashing )
{
s_binaryWithHashing = new BinaryCanonicalizer( true );
}
return s_binaryWithHashing;
}
}
abstract class CanonicalizerBase : ICanonicalizer
{
bool m_hashValue;
public CanonicalizerBase( bool hashValue )
{
m_hashValue = hashValue;
}
public byte[] Canonicalize( object obj )
{
if( null == obj )
{
throw IDT.ThrowHelperArgumentNull( "obj" );
}
byte[] raw = GetRawForm( obj );
if( !m_hashValue )
{
return raw;
}
byte[] hashValue = new byte[ HashUtility.HashBufferLength ];
HashUtility.SetHashValue( hashValue, 0, raw );
return hashValue;
}
public abstract bool CanCanonicalize( object obj );
protected abstract byte[] GetRawForm( object obj );
}
class BinaryCanonicalizer : CanonicalizerBase
{
Dictionary m_canonicalizers;
public BinaryCanonicalizer( bool hashValue )
: base( hashValue )
{
m_canonicalizers = new Dictionary();
CreateCanonicalizers();
}
public override bool CanCanonicalize( object obj )
{
if( null == obj )
{
throw IDT.ThrowHelperArgumentNull( "obj" );
}
return m_canonicalizers.ContainsKey( obj.GetType() );
}
void CreateCanonicalizers()
{
m_canonicalizers.Add( typeof( Int16 ), new CanonicalizeObjectCallback( CanonicalizeInt16 ) );
m_canonicalizers.Add( typeof( UInt16 ), new CanonicalizeObjectCallback( CanonicalizeUInt16 ) );
m_canonicalizers.Add( typeof( Int32 ), new CanonicalizeObjectCallback( CanonicalizeInt32 ) );
m_canonicalizers.Add( typeof( UInt32 ), new CanonicalizeObjectCallback( CanonicalizeUInt32 ) );
m_canonicalizers.Add( typeof( Int64 ), new CanonicalizeObjectCallback( CanonicalizeInt64 ) );
m_canonicalizers.Add( typeof( UInt64 ), new CanonicalizeObjectCallback( CanonicalizeUInt64 ) );
m_canonicalizers.Add( typeof( Byte ), new CanonicalizeObjectCallback( CanonicalizeByte ) );
m_canonicalizers.Add( typeof( Byte[] ), new CanonicalizeObjectCallback( CanonicalizeByteArray ) );
m_canonicalizers.Add( typeof( String ), new CanonicalizeObjectCallback( CanonicalizeString ) );
m_canonicalizers.Add( typeof( Guid ), new CanonicalizeObjectCallback( CanonicalizeGuid ) );
m_canonicalizers.Add( typeof( GlobalId ), new CanonicalizeObjectCallback( CanonicalizeGlobalId ) );
}
protected override byte[] GetRawForm( object obj )
{
return m_canonicalizers[ obj.GetType() ]( obj );
}
unsafe byte[] CanonicalizeGlobalId( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
Guid value = (Guid)((GlobalId)data);
return value.ToByteArray();
}
unsafe byte[] CanonicalizeGuid( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
Guid value = (Guid)data;
return value.ToByteArray();
}
unsafe byte[] CanonicalizeInt16( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
Int16 value = (Int16)data;
byte[] buffer = new byte[ sizeof( Int16 ) ];
fixed( byte* pBuffer = &buffer[ 0 ] )
{
*( (Int16*)pBuffer ) = value;
}
return buffer;
}
unsafe byte[] CanonicalizeUInt16( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
UInt16 value = (UInt16)data;
byte[] buffer = new byte[ sizeof( UInt16 ) ];
fixed( byte* pBuffer = &buffer[ 0 ] )
{
*( (UInt16*)pBuffer ) = value;
}
return buffer;
}
unsafe byte[] CanonicalizeInt32( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
Int32 value = (Int32)data;
byte[] buffer = new byte[ sizeof( Int32 ) ];
fixed( byte* pBuffer = &buffer[ 0 ] )
{
*( (Int32*)pBuffer ) = value;
}
return buffer;
}
unsafe byte[] CanonicalizeUInt32( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
UInt32 value = (UInt32)data;
byte[] buffer = new byte[ sizeof( UInt32 ) ];
fixed( byte* pBuffer = &buffer[ 0 ] )
{
*( (UInt32*)pBuffer ) = value;
}
return buffer;
}
unsafe byte[] CanonicalizeInt64( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
Int64 value = (Int64)data;
byte[] buffer = new byte[ sizeof( Int64 ) ];
fixed( byte* pBuffer = &buffer[ 0 ] )
{
*( (Int64*)pBuffer ) = value;
}
return buffer;
}
unsafe byte[] CanonicalizeUInt64( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
UInt64 value = (UInt64)data;
byte[] buffer = new byte[ sizeof( UInt64 ) ];
fixed( byte* pBuffer = &buffer[ 0 ] )
{
*( (UInt64*)pBuffer ) = value;
}
return buffer;
}
byte[] CanonicalizeString( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
string value = (string)data;
if( String.IsNullOrEmpty(value) )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
return Encoding.Unicode.GetBytes( value );
}
byte[] CanonicalizeByte( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
byte value = (byte)data;
return new byte[]{value};
}
byte[] CanonicalizeByteArray( object data )
{
if( null == data )
{
throw IDT.ThrowHelperArgumentNull( "data" );
}
byte[] value = (byte[])data;
return value;
}
}
//
// Base class for String canononicalization.
//
abstract class StringCanonicalizerBase : CanonicalizerBase
{
static readonly Type[] s_validTypes =
{
typeof( string ),
typeof( Uri )
};
Encoding m_encoding;
CultureInfo m_culture;
protected StringCanonicalizerBase(
bool hashValue,
Encoding encoding,
CultureInfo culture )
: base( hashValue )
{
if( null == encoding )
{
throw IDT.ThrowHelperArgumentNull( "encoding" );
}
if( null == culture )
{
m_culture = CultureInfo.InvariantCulture;
}
else
{
m_culture = culture;
}
m_encoding = encoding;
}
protected virtual Type[] SupportedTypes
{
get
{
return s_validTypes;
}
}
public CultureInfo Culture
{
get{ return m_culture; }
}
public Encoding Encoding
{
get{ return m_encoding; }
}
public override bool CanCanonicalize( object obj )
{
if( null == obj )
{
throw IDT.ThrowHelperArgumentNull( "obj" );
}
if( null == SupportedTypes )
return false;
return -1 != Array.IndexOf( SupportedTypes, obj.GetType() );
}
protected override byte[] GetRawForm( object obj )
{
string data = obj.ToString();
return GetBytesFromString( data );
}
protected abstract byte[] GetBytesFromString( string data );
}
//
// Default String Canonicalizer.
//
class CaseSensitiveCanonicalizer : StringCanonicalizerBase
{
public CaseSensitiveCanonicalizer( bool hashValue, Encoding encoding,CultureInfo culture )
: base( hashValue, encoding,culture )
{
}
protected override byte[] GetBytesFromString( string data )
{
return Encoding.GetBytes( data );
}
}
//
// Culture Sensitive/Case Sensitive string canonicalizer.
//
class CaseInsensitiveCanonicalizer : StringCanonicalizerBase
{
public CaseInsensitiveCanonicalizer( bool hashValue, Encoding encoding,CultureInfo culture )
: base( hashValue, encoding, culture )
{
}
protected override byte[] GetBytesFromString( string obj )
{
return Encoding.GetBytes(
Culture.TextInfo.ToUpper( obj ) );
}
}
}
}
// 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
- HostedTransportConfigurationBase.cs
- WebMessageEncodingBindingElement.cs
- AttachedPropertyDescriptor.cs
- ReplyChannelAcceptor.cs
- ApplicationInfo.cs
- UniqueEventHelper.cs
- TemplateKey.cs
- ViewStateChangedEventArgs.cs
- LineVisual.cs
- UnhandledExceptionEventArgs.cs
- MachineKeyConverter.cs
- OleDbFactory.cs
- SqlColumnizer.cs
- _Rfc2616CacheValidators.cs
- ErrorStyle.cs
- Button.cs
- ImageUrlEditor.cs
- ContainerActivationHelper.cs
- ProviderConnectionPoint.cs
- DesignerAdRotatorAdapter.cs
- XmlNullResolver.cs
- IdentitySection.cs
- RemoteAsymmetricSignatureFormatter.cs
- ClientRolePrincipal.cs
- NetworkInterface.cs
- DataGridViewCellParsingEventArgs.cs
- StylusPlugin.cs
- Collection.cs
- SecurityContext.cs
- ResXBuildProvider.cs
- SubqueryTrackingVisitor.cs
- ServerValidateEventArgs.cs
- IconConverter.cs
- ByeMessageCD1.cs
- CodeExpressionStatement.cs
- ConditionCollection.cs
- StringReader.cs
- SpeakProgressEventArgs.cs
- TickBar.cs
- FontCollection.cs
- VerificationException.cs
- Socket.cs
- DataSourceExpressionCollection.cs
- TextSpan.cs
- ListItemCollection.cs
- BooleanExpr.cs
- baseaxisquery.cs
- LightweightCodeGenerator.cs
- namescope.cs
- TextRunProperties.cs
- FormsAuthenticationUser.cs
- StopStoryboard.cs
- MenuEventArgs.cs
- HttpCapabilitiesSectionHandler.cs
- ADConnectionHelper.cs
- CompositeFontFamily.cs
- DataControlLinkButton.cs
- HttpModuleAction.cs
- DiscoveryDocumentReference.cs
- EraserBehavior.cs
- AddInIpcChannel.cs
- XsltSettings.cs
- Binding.cs
- Group.cs
- BindingMAnagerBase.cs
- XhtmlBasicImageAdapter.cs
- CommonXSendMessage.cs
- ApplicationServiceManager.cs
- newitemfactory.cs
- GlobalizationSection.cs
- Overlapped.cs
- DetailsViewModeEventArgs.cs
- SystemIcmpV6Statistics.cs
- Size.cs
- EventMap.cs
- basevalidator.cs
- X509ThumbprintKeyIdentifierClause.cs
- FormsAuthenticationUser.cs
- XPathParser.cs
- ApplyImportsAction.cs
- WebBrowsableAttribute.cs
- HttpListenerRequest.cs
- ProtocolsConfigurationEntry.cs
- RuntimeResourceSet.cs
- ADRoleFactoryConfiguration.cs
- CategoryGridEntry.cs
- CopyAction.cs
- CodeVariableDeclarationStatement.cs
- SystemWebExtensionsSectionGroup.cs
- InputScopeAttribute.cs
- FrameworkElement.cs
- ReferentialConstraint.cs
- SqlConnectionHelper.cs
- InvalidStoreProtectionKeyException.cs
- ExtractorMetadata.cs
- CfgSemanticTag.cs
- documentsequencetextcontainer.cs
- IndentedTextWriter.cs
- ContractValidationHelper.cs
- BulletedList.cs