1 //------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //------------------------------------------------------------
4 namespace System.ServiceModel.Channels
5 {
6     using System.Xml;
7     using System.ServiceModel.Description;
8     using System.ServiceModel.Configuration;
9 
10     static class PrivacyNoticePolicyStrings
11     {
12         public const string PrivacyNoticeName = "PrivacyNotice";
13         public const string PrivacyNoticeVersionAttributeName = "Version";
14         public const string PrivacyNoticeNamespace = "http://schemas.xmlsoap.org/ws/2005/05/identity";
15         public const string PrivacyNoticePrefix = "ic";
16     }
17 
18     public sealed class PrivacyNoticeBindingElementImporter : IPolicyImportExtension
19     {
IPolicyImportExtension.ImportPolicy(MetadataImporter importer, PolicyConversionContext policyContext)20         void IPolicyImportExtension.ImportPolicy(MetadataImporter importer, PolicyConversionContext policyContext)
21         {
22             if (policyContext == null)
23                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("policyContext");
24 
25             XmlElement privacyNoticeAssertion = PolicyConversionContext.FindAssertion(policyContext.GetBindingAssertions(),
26                 PrivacyNoticePolicyStrings.PrivacyNoticeName, PrivacyNoticePolicyStrings.PrivacyNoticeNamespace, true);
27             if (privacyNoticeAssertion != null)
28             {
29                 PrivacyNoticeBindingElement settings =
30                     policyContext.BindingElements.Find<PrivacyNoticeBindingElement>();
31 
32                 if (null == settings)
33                 {
34                     settings = new PrivacyNoticeBindingElement();
35                     policyContext.BindingElements.Add(settings);
36                 }
37 
38                 settings.Url = new Uri(privacyNoticeAssertion.InnerText);
39                 string versionString = privacyNoticeAssertion.GetAttribute(PrivacyNoticePolicyStrings.PrivacyNoticeVersionAttributeName, PrivacyNoticePolicyStrings.PrivacyNoticeNamespace);
40                 if (string.IsNullOrEmpty(versionString))
41                 {
42                     throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.CannotImportPrivacyNoticeElementWithoutVersionAttribute)));
43                 }
44 
45                 int version = 0;
46                 if (!Int32.TryParse(versionString, out version))
47                 {
48                     throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.PrivacyNoticeElementVersionAttributeInvalid)));
49                 }
50                 settings.Version = version;
51             }
52         }
53     }
54 }
55