File: StreamSecurityUpgradeInitiatorBase.cs

package info (click to toggle)
mono 4.6.2.7%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 778,148 kB
  • ctags: 914,052
  • sloc: cs: 5,779,509; xml: 2,773,713; ansic: 432,645; sh: 14,749; makefile: 12,361; perl: 2,488; python: 1,434; cpp: 849; asm: 531; sql: 95; sed: 16; php: 1
file content (131 lines) | stat: -rw-r--r-- 4,013 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace System.ServiceModel.Channels
{
    using System.IO;
    using System.ServiceModel;
    using System.ServiceModel.Security;

    abstract class StreamSecurityUpgradeInitiatorBase : StreamSecurityUpgradeInitiator
    {
        EndpointAddress remoteAddress;
        Uri via;
        SecurityMessageProperty remoteSecurity;
        bool securityUpgraded;
        string nextUpgrade;
        bool isOpen;

        protected StreamSecurityUpgradeInitiatorBase(string upgradeString, EndpointAddress remoteAddress, Uri via)
        {
            this.remoteAddress = remoteAddress;
            this.via = via;
            this.nextUpgrade = upgradeString;
        }

        protected EndpointAddress RemoteAddress
        {
            get
            {
                return this.remoteAddress;
            }
        }

        protected Uri Via
        {
            get
            {
                return this.via;
            }
        }

        public override IAsyncResult BeginInitiateUpgrade(Stream stream, AsyncCallback callback, object state)
        {
            if (stream == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("stream");
            }

            if (!this.isOpen)
            {
                this.Open(TimeSpan.Zero);
            }

            return this.OnBeginInitiateUpgrade(stream, callback, state);
        }

        public override Stream EndInitiateUpgrade(IAsyncResult result)
        {
            if (result == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("result");
            }
            Stream retValue = this.OnEndInitiateUpgrade(result, out this.remoteSecurity);
            this.securityUpgraded = true;
            return retValue;
        }

        public override string GetNextUpgrade()
        {
            string result = this.nextUpgrade;
            this.nextUpgrade = null;
            return result;
        }

        public override SecurityMessageProperty GetRemoteSecurity()
        {
            if (!securityUpgraded)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.OperationInvalidBeforeSecurityNegotiation)));
            }

            return this.remoteSecurity;
        }

        public override Stream InitiateUpgrade(Stream stream)
        {
            if (stream == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("stream");
            }

            if (!this.isOpen)
            {
                this.Open(TimeSpan.Zero);
            }

            Stream result = this.OnInitiateUpgrade(stream, out this.remoteSecurity);
            this.securityUpgraded = true;
            return result;
        }

        internal override void EndOpen(IAsyncResult result)
        {
            base.EndOpen(result);
            this.isOpen = true;
        }

        internal override void Open(TimeSpan timeout)
        {
            base.Open(timeout);
            this.isOpen = true;
        }

        internal override void EndClose(IAsyncResult result)
        {
            base.EndClose(result);
            this.isOpen = false;
        }

        internal override void Close(TimeSpan timeout)
        {
            base.Close(timeout);
            this.isOpen = false;
        }

        protected abstract IAsyncResult OnBeginInitiateUpgrade(Stream stream, AsyncCallback callback, object state);
        protected abstract Stream OnEndInitiateUpgrade(IAsyncResult result,
            out SecurityMessageProperty remoteSecurity);
        protected abstract Stream OnInitiateUpgrade(Stream stream, out SecurityMessageProperty remoteSecurity);
    }
}