| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- //
- // System.Web.Services.Protocols.SoapMessage.cs
- //
- // Author:
- // Tim Coleman ([email protected])
- // Lluis Sanchez Gual ([email protected])
- //
- // Copyright (C) Tim Coleman, 2002
- //
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- using System.IO;
- using System.Web.Services;
- namespace System.Web.Services.Protocols {
- public abstract class SoapMessage {
- #region Fields
- string content_type = "text/xml";
- string content_encoding;
- SoapException exception = null;
- SoapHeaderCollection headers;
- SoapMessageStage stage;
- Stream stream;
- object[] inParameters;
- object[] outParameters;
-
- #if NET_2_0
- SoapProtocolVersion soapVersion;
- #endif
- #endregion // Fields
- #region Constructors
- internal SoapMessage ()
- {
- headers = new SoapHeaderCollection ();
- }
- internal SoapMessage (Stream stream)
- {
- this.stream = stream;
- }
- internal SoapMessage (Stream stream, SoapException exception)
- {
- this.exception = exception;
- this.stream = stream;
- headers = new SoapHeaderCollection ();
- }
- #endregion
- #region Properties
- internal object[] InParameters
- {
- get { return inParameters; }
- set { inParameters = value; }
- }
- internal object[] OutParameters
- {
- get { return outParameters; }
- set { outParameters = value; }
- }
- public abstract string Action
- {
- get;
- }
- public string ContentType {
- get { return content_type; }
- set { content_type = value; }
- }
- public SoapException Exception {
- get { return exception; }
- #if NET_2_0
- set { exception = value; }
- #endif
- }
- public SoapHeaderCollection Headers {
- get { return headers; }
- }
- public abstract LogicalMethodInfo MethodInfo {
- get;
- }
- public abstract bool OneWay {
- get;
- }
- public SoapMessageStage Stage {
- get { return stage; }
- }
- internal void SetStage (SoapMessageStage stage)
- {
- this.stage = stage;
- }
-
- public Stream Stream {
- get {
- return stream;
- }
- }
- public abstract string Url {
- get;
- }
-
- #if NET_1_1
- public string ContentEncoding
- {
- get { return content_encoding; }
- set { content_encoding = value; }
- }
- #else
- internal string ContentEncoding
- {
- get { return content_encoding; }
- set { content_encoding = value; }
- }
- #endif
- #if NET_2_0
- [System.Runtime.InteropServices.ComVisible(false)]
- public virtual SoapProtocolVersion SoapVersion {
- get { return soapVersion; }
- }
- #endif
-
- #endregion Properties
- #region Methods
- protected abstract void EnsureInStage ();
- protected abstract void EnsureOutStage ();
- protected void EnsureStage (SoapMessageStage stage)
- {
- if ((((int) stage) & ((int) Stage)) == 0)
- throw new InvalidOperationException ("The current SoapMessageStage is not the asserted stage or stages.");
- }
- public object GetInParameterValue (int index)
- {
- return inParameters [index];
- }
- public object GetOutParameterValue (int index)
- {
- if (MethodInfo.IsVoid) return outParameters [index];
- else return outParameters [index + 1];
- }
- public object GetReturnValue ()
- {
- if (!MethodInfo.IsVoid && exception == null) return outParameters [0];
- else return null;
- }
- internal void SetHeaders (SoapHeaderCollection headers)
- {
- this.headers = headers;
- }
- internal void SetException (SoapException ex)
- {
- exception = ex;
- }
- internal void CollectHeaders (object target, HeaderInfo[] headers, SoapHeaderDirection direction)
- {
- Headers.Clear ();
- foreach (HeaderInfo hi in headers)
- {
- if ((hi.Direction & direction) != 0 && !hi.IsUnknownHeader)
- {
- SoapHeader headerVal = hi.GetHeaderValue (target) as SoapHeader;
- if (headerVal != null)
- Headers.Add (headerVal);
- }
- }
- }
- internal void UpdateHeaderValues (object target, HeaderInfo[] headersInfo)
- {
- foreach (SoapHeader header in Headers)
- {
- HeaderInfo hinfo = FindHeader (headersInfo, header.GetType ());
- if (hinfo != null) {
- hinfo.SetHeaderValue (target, header);
- header.DidUnderstand = !hinfo.IsUnknownHeader;
- }
- }
- }
- HeaderInfo FindHeader (HeaderInfo[] headersInfo, Type headerType)
- {
- HeaderInfo unknownHeaderInfo = null;
-
- foreach (HeaderInfo headerInfo in headersInfo) {
- if (headerInfo.HeaderType == headerType)
- return headerInfo;
- else if (headerInfo.IsUnknownHeader)
- unknownHeaderInfo = headerInfo;
- }
- return unknownHeaderInfo;
- }
- #endregion // Methods
- }
- }
|